zoukankan      html  css  js  c++  java
  • 二叉树的下一个节点

    题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。next指针是二叉树的父节点

    我的代码:

    class Solution {
    public:
        vector<TreeLinkNode*> vec;
        void OrderTrave(TreeLinkNode* pRoot)
        {
            OrderTrave(pRoot->left);
            vec.push_back(pRoot);
            OrderTrave(pRoot->right);
        }
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            if(!pNode) return NULL;
            TreeLinkNode* pRoot = pNode;
            while(pRoot->next)
                pRoot = pRoot->next;
            OrderTrave(pRoot);
            for(int i = 0; i < vec.size()-1; i++)
            {
                if(vec[i] == pNode)
                    return vec[i+1];
            }
            return NULL;
        }
    };

    借鉴后的代码:通过

    思路:如果节点为NULL,返回NULL

    1.如果节点有右子树,那么一直遍历,找到它的最左面的节点

    2.节点没有右子树,那么就要向上找。找到他的父节点,看是不是父节点的左孩子,是则返回父节点,不是则将父节点置为当前节点,重复刚才的步骤判断。

    补充:如果节点不是父节点的左孩子,那么就继续向上找,直到为父节点的左孩子。到根还没找得到,就是NULL了

     1 class Solution {
     2 public:
     3     TreeLinkNode* GetNext(TreeLinkNode* pNode)
     4     {
     5         if(!pNode) return NULL;
     6         if(pNode->right)
     7         {
     8             pNode = pNode->right;
     9             while(pNode->left)
    10                 pNode = pNode->left;
    11             return pNode;
    12         }
    13         while(pNode->next)
    14         {
    15             TreeLinkNode* pRoot = pNode->next;
    16             if(pRoot->left == pNode)
    17             {
    18                 return pRoot;
    19             }
    20             pNode = pNode->next;
    21         }
    22         return NULL;
    23     }
    24 };
  • 相关阅读:
    [算法] 网络中最小费用最大流
    [题解] 完美数
    [算法] 扫描线及其应用
    等待时间
    键盘操作
    鼠标操作
    元素常用操作
    元素的定位·CSS
    元素的定位·XPATH
    元素的定位
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8857857.html
Copyright © 2011-2022 走看看