剑指offer(五十七):二叉树的下一个结点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:一共有三种情况:
1.为空,直接返回null
2.该节点含有右子树:那么其中序遍历的下一个结点就是其右子树最左下的结点,
3.该节点不含右子树:如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。

C++实现:

/*
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)
            return NULL;
        if(!pNode->right){//如果没有右子树
            TreeLinkNode* p = pNode;
            TreeLinkNode* pFather = p->next;
            //如果没有右子树,那么一直向上找,直到某一个结点是其父节点的左孩子,返回父节点
            while(pFather){
                if(pFather->left == p){
                    return pFather;
                }
                p = pFather;
                pFather = p->next;
            }
            return NULL;//中序遍历的最后一个结点
        }
        else{//如果存在右子树,那么中序遍历的下一个结点就是右子树最左下结点
            TreeLinkNode* pRight = pNode->right;
            while(pRight->left){
                pRight = pRight->left;
            }
            return pRight;
        }
    }
};

 相同的思路,java实现,代码稍微做了优化,但是思路是一致的

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode == null){
            return null;
        }
        if(pNode.right != null){
            TreeLinkNode p = pNode.right;
            while(p.left != null)
                p = p.left;
            return p;
        }
        while(pNode.next != null){
            if(pNode.next.left == pNode)
                return pNode.next;
            pNode = pNode.next;
        }
        return null;
    }
}

原文地址:https://www.cnblogs.com/ttzz/p/13472163.html