剑指offer 58题 【树】二叉树的下一个结点

来源:互联网 发布:数据透视表汇总求和 编辑:程序博客网 时间:2024/06/18 17:52

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
牛客传送门:点击打开链接
思路:
①判断当前节点是否有右子树,如果有,那么右子树最左节点就是返回值。
②如果没有右子树,则判断父节点的左子树是不是当前节点,若是则返回父节点;若不是则把当前节点设置为父节点,继续这个判断。


class TreeLinkNode {    int val;    TreeLinkNode left = null;    TreeLinkNode right = null;    TreeLinkNode next = null;    TreeLinkNode(int val) {        this.val = val;    }}public class Title58 {    public TreeLinkNode GetNext(TreeLinkNode pNode)    {        if(pNode == null)            return null;        TreeLinkNode ret = null;        // 如果当前节点的右子树不为空,  则下一个节点是右子树的最左子节点        if(pNode.right != null){            ret = pNode.right;            while(ret.left != null)                ret = ret.left;                        return ret;        }                if(pNode.next != null){            ret = pNode.next;            while(ret != null && ret.left != pNode){ // 这里注意ret为空的情况                pNode = ret;                ret = ret.next;            }                        return ret;        }        return ret;    }        public static void main(String[] args) {        TreeLinkNode a = new TreeLinkNode(6);        TreeLinkNode b = new TreeLinkNode(2);        TreeLinkNode c = new TreeLinkNode(8);        TreeLinkNode d = new TreeLinkNode(1);        TreeLinkNode e = new TreeLinkNode(4);        TreeLinkNode f = new TreeLinkNode(7);        TreeLinkNode g = new TreeLinkNode(9);        TreeLinkNode h = new TreeLinkNode(3);        TreeLinkNode i = new TreeLinkNode(5);        TreeLinkNode j = new TreeLinkNode(10);        a.left = b;a.right = c;        b.left = d;b.right = e;        c.left = f;c.right = g;        e.left = h;e.right = i;        g.right = j;                b.next = a;c.next = a;        d.next = b;e.next = b;        f.next = c;g.next = c;        h.next = e;i.next = e;        j.next = g;                // 进行一次中序遍历        List<TreeLinkNode> list = new ArrayList<TreeLinkNode>();        new Title58().print(a,list);        // 输出值:1 2 3 4 5 6 7 8 9 10        list.forEach( n -> System.out.print(n.val + " ") );        // 另一种lambda写法        // List<Integer> numList = list.stream().map((r) -> r.val).collect(Collectors.toList());        // System.out.println(numList);                // 遍历list,输出当前节点的下一节点val        // 输出值: 2 3 4 5 6 7 8 9 10 null        for(TreeLinkNode node : list){            TreeLinkNode next = new Title58().GetNext(node);            if(next != null)                System.out.print(next.val + " ");            else                System.out.println("null");        }    }        public void print(TreeLinkNode root,List<TreeLinkNode> list){        if(root.left != null)            print(root.left,list);        list.add(root);        if(root.right != null)            print(root.right,list);    }}


0 0