二叉树的下一个节点

题目:

给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。

注意:

  • 如果给定的节点是中序遍历序列的最后一个,则返回空节点;
  • 二叉树一定不为空,且给定的节点一定不是空节点;

题目分析:

二叉树的下一个节点为中序遍历序列结果的下一个元素

中序遍历顺序为先访问左子树,然后根结点,最后访问右子树

结点左右子树的情况不同,它的后继也不一样

可分多种情况讨论

 

情况1:节点有右儿子且右儿子有左儿子,则结果为右儿子的最左结点,否则为右儿子

如F,它的右儿子是E,E的最左结点为H,返回H

如E,它的右儿子是G,G没有左儿子,返回G

 

情况二:节点没有右儿子 

则需要回溯father节点,找到第一个father节点是father节点的father的左子树,返回其father即可

 

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode *father;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* p) {
        //右结点存在
        if(p->right){
            p = p->right;
            while(p && p->left) p = p->left;
            return p;
        }
        
        //右结点不存在并是父结点的右儿子
        while(p->father && p == p->father->right) p = p->father;
        
        //右结点不存在并且不是父结点的右儿子
        return p->father;
    }
};

 

posted @ 2019-05-31 03:53  roov  阅读(3)  评论(0编辑  收藏  举报