剑指offer面试题八:二叉树的下一个节点

版权声明:敲一敲看一看 https://blog.csdn.net/idealhunting/article/details/84978040

题目描述:

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

思路

1.若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )

2. 若该节点不存在右子树:这时分两种情况:

 1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D )

 2 该节点为父节点的右子节点,则沿着父节点向上遍历,知道找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点(如图节点 I ,沿着父节点一直向上查找找到 B ( B 为其父节点的左子节点),则 B 的父节点 A 为下一个节点)

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        
    }
};

牛客AC:

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode==nullptr)return nullptr;
        if(pNode->right!=nullptr){  //如果有右子树,则找右子树的最左节点
            pNode=pNode->right;
            while(pNode->left!=nullptr){
                pNode=pNode->left;
            }
            return pNode;
        }
        while(pNode->next!=nullptr&&pNode==pNode->next->right){//没右子树,则找第一个当前节点是父节点左孩子的节点
            pNode=pNode->next;
        }
        return pNode->next;
    }
};

剑指offer:

BinaryTreeNode* GetNext(BinaryTreeNode* pNode){
    if(pNode==nullptr)return nullptr;
    BinaryTreeNode* ans=nullptr;
    if(pNode->rchild!=nullptr){//右子树不为空寻找右子树中最左边那个
        pNode=pNode->rchild;
        while(pNode->lchild!=nullptr){
            pNode=pNode->lchild;
        }
        ans=pNode;
    }
    else
    if(pNode->father!=nullptr){//右子树为空且父结点不为空(即父结点不是root),如果父结点为空,即当前元素为最后一个元素
        BinaryTreeNode* now=pNode;
        BinartTreeNode* pfather=pNode->fatehr;
        while(pfater!=nullptr&&now==pfather->rchild){//寻找父结点是其父结点的左孩子的的结点的父亲为ans
            now=pfather;
            pfather=pfather->father;
        }
        ans=pfather;
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/idealhunting/article/details/84978040