二叉树的下一个结点-根据中序遍历的特点(O(n),O(1))解题

二叉树的下一个结点

http://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e

//解题思路
/*
       8
    6    10
   5 7  9  11
根据中序遍历的特点(O(n),O(1)):
1.pNode的右孩子为空,中序遍历顺序的下一个结点可能在其父辈root里(注意是父辈,不只是父亲)
    1.1 pNode为root的左孩子,则pNode的下一个结点为root(例如5、7、9)
    1.2 否则返回null(例如11)
2.pNode的右孩子不为空时,中序遍历顺序的下一个结点在其右子树里,此时中序遍历右子树取第一个结果即可(例如6、8、10)
 */
//犯错点
/*
  求中序遍历右子树取第一个结果即取右子树最左边的节点,不用调用inOrder()耗费运行时间
 */
public TreeLinkNode GetNext(TreeLinkNode pNode) {
    if (pNode == null) return null;
    //1.pNode的右孩子为空,中序遍历顺序的下一个结点可能在其父辈里
    if (pNode.right == null){
        TreeLinkNode root = pNode.next;
        TreeLinkNode child = pNode;
        //1.1 pNode为root父辈的左孩子,则pNode的下一个结点为root
        while (root != null){
            if (root.left == child) return root;
            child = root;
            root = root.next;
        }
        //1.2 父辈root为空,则返回null
        return null;
    }
    //2.pNode的右孩子不为空,中序遍历顺序的下一个结点在其右子树里,此时中序遍历右子树取第一个结果即可
    TreeLinkNode rightTree = pNode.right;
    //求中序遍历右子树取第一个结果即取右子树最左边的节点
    while (rightTree.left != null){
        rightTree = rightTree.left;
    }
    return rightTree;
}
全部评论

相关推荐

10-21 16:54
门头沟学院 Java
后端转测开第一人:微服务没用 校招都不看微服务的 还有就是后端行情是这样的 找实习纯看运气 秋招更是吃运气和缘分 如果对代码没有极致的追求 可以转测开
应届生简历当中,HR最关...
点赞 评论 收藏
分享
头像
10-27 15:50
门头沟学院 Java
想进开水团喝开水:有一种店 只能外卖 不能堂食 你猜为什么
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务