• 二叉树的下一个节点


    题目描述

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

    解题思路:

    情况一、所给的节点的右子树不是空,则顺着找最小的

    情况二、所给的节点右子树是空,且是左儿子则返回父节点

    情况三、所给的节点右子树是空,且是右儿子且父亲是祖父的左儿子,则返回祖父节点

    class Solution {
    public:
        TreeLinkNode* getRoot(TreeLinkNode* pNode){
            TreeLinkNode* root = NULL;
            while(pNode != NULL){
                root = pNode;
                pNode = pNode->next;
            }
            return root;
        }
        TreeLinkNode* _getNext(TreeLinkNode* root, TreeLinkNode *pNode){
            if(root == NULL) return NULL;
    //        cout<<"rval="<<root->val<<endl;
            if(root == pNode){
                TreeLinkNode * res = NULL;
                if(root->right != NULL){
                    //当前节点的右子树不是空则顺着找最左的节点
                    res = root->right;
                    while(res != NULL){
                        if(res->left != NULL){
                            res = res->left;
                        }else{
                            break;
                        }
                    }
                }else{
                    if(root->next != NULL){
                        if(root->next->left == root){
                            //如果当前节点的右子树为空且当前节点是左子树
                            return root->next;
                        }else if(root->next->right == root && root->next == root->next->next->left){
                            //如果当前节点的右子树为空,当前节点是右子树且父节点是祖父的左子树
                            return root->next->next;
                        }
                    }
                }
    //            cout<<"xxx"<<endl;
                return res;
            }else{
    
                TreeLinkNode* lRes = NULL;
                if(root->left != NULL){
                    lRes = _getNext(root->left, pNode);
                }
                TreeLinkNode * rRes = NULL;
                if(root->right != NULL){
                    rRes = _getNext(root->right, pNode);
                }
                if(lRes != NULL){
                    return lRes;
                }else if(rRes != NULL){
                    return rRes;
                }else{
                    return NULL;
                }
            }
        }
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            TreeLinkNode *root = getRoot(pNode);
            return _getNext(root, pNode);
        }
    };
    

      

  • 相关阅读:
    区间dp体会
    P1083借教室 noip提高组复赛2012
    P2678跳石头体会 noip2015提高组
    tarjan求LCA的体会
    P1006 传纸条
    P1140 相似基因 详解
    UVA1025 城市里的间谍 A Spy in the Metro 题解
    DAG上的动规嵌套矩形问题(含思考题)
    洛谷P1030c++递归求解先序排列
    Test 2019.7.22
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10698316.html
Copyright © 2020-2023  润新知