黑马程序员技术交流社区

标题: 【上海校区】算法题(三十五):二叉树的下一个结点 [打印本页]

作者: 梦缠绕的时候    时间: 2018-11-26 09:17
标题: 【上海校区】算法题(三十五):二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

分析
分情况讨论:

1.如果结点有右孩子,则返回右子树中最后一个左孩子;

2.如果结点没有右孩子,且该结点是父结点的左孩子,则返回父结点;

3.如果结点没有右孩子,且该结点是父结点的右孩子,则向上遍历父结点,返回第一个当前节点是父节点左孩子的节点

代码
public class NextOne {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                TreeLinkNode node1 = new TreeLinkNode(1);
                TreeLinkNode node2 = new TreeLinkNode(2);
                TreeLinkNode node3 = new TreeLinkNode(3);
                TreeLinkNode node4 = new TreeLinkNode(4);
                TreeLinkNode node5 = new TreeLinkNode(5);
                TreeLinkNode node6 = new TreeLinkNode(6);
                TreeLinkNode node7 = new TreeLinkNode(7);
                TreeLinkNode node8 = new TreeLinkNode(8);
                TreeLinkNode node9 = new TreeLinkNode(9);
                node6.left = node2; node6.right = node8; node2.next = node6; node8.next = node6;
               
                node2.left = node1; node2.right = node4; node8.left=node7; node8.right = node9;
                node1.next = node2; node4.next = node2; node7.next = node8; node9.next = node8;
               
                node4.left = node3; node4.right = node5; node3.next = node4; node5.next = node4;
               
                System.out.println(GetNext(node1).val);
        }
       
        //自己写的
        public static TreeLinkNode next(TreeLinkNode node){
                if(node == null){
                        return null;
                }
                TreeLinkNode lastOne = null;

                if(node.right != null){
                        lastOne = node.right;
                        TreeLinkNode temp = lastOne;
                        while(lastOne != null){
                                temp = lastOne;
                                lastOne = lastOne.left;
                        }
                        lastOne = temp;
                        return lastOne;
                }
                if(node.next.left == node){
                        return node.next;
                }
                TreeLinkNode parent = node.next;
                while(parent!=null){
                        if(parent.next.left == parent){
                                return parent.next;
                        }
                        parent = parent.next;
                }
                return null;
               
        }
        //牛客网上的
        public static TreeLinkNode GetNext(TreeLinkNode node) {
                if (node == null)
                        return null;
                if (node.right != null) { // 如果有右子树,则找右子树的最左节点
                        node = node.right;
                        while (node.left != null)
                                node = node.left;
                        return node;
                }
                while (node.next != null) { // 没右子树,则找第一个当前节点是父节点左孩子的节点
                        if (node.next.left == node)
                                return node.next;
                        node = node.next;
                }
                return null; // 退到了根节点仍没找到,则返回null
        }

}

class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}

---------------------
作者:另一个我竟然存在
来源:CSDN
原文:https://blog.csdn.net/qq_24034545/article/details/84344309
版权声明:本文为博主原创文章,转载请附上博文链接!


作者: 不二晨    时间: 2018-11-28 15:48
奈斯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2