vlambda博客
学习文章列表

剑指Offer-57 二叉树的下一个结点


题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。


示例

输入:暂无

输出:暂无


在本题给出的二叉树中,其中的数的结点也是一个特殊的数据结构,代码如下


 1public class TreeLinkNode {
2    int val;
3    TreeLinkNode left = null;
4    TreeLinkNode right = null;
5    TreeLinkNode next = null;
6
7    TreeLinkNode(int val) {
8        this.val = val;
9    }
10}


我们可以看到,除了普通二叉树结点都有的左右孩子的引用之外,还额外有一个next引用,在本题中也给出了是指向了本结点的父结点。

首先遍历的规则是中序遍历,所以是左、根、右的一种遍历。




结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G)     2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。


 1public class Solution {
2    public TreeLinkNode GetNext(TreeLinkNode pNode){
3        if(pNode==null)
4            return null;
5        if(pNode.left==null&&pNode.right==null){
6            if(pNode.next==null)
7                return null;
8            else{
9                if(pNode.next.right==pNode){
10                    TreeLinkNode temp=pNode.next;
11                    if(temp.next==null||temp.next.right==temp)
12                        return null;
13                    while(temp.next!=null)
14                        temp=temp.next;
15                    return temp;
16                }else if(pNode.next.left==pNode){
17                    return pNode.next;
18                }
19            }
20        }
21        if(pNode.right!=null){
22            TreeLinkNode temp=pNode.right;
23            while(temp.left!=null)
24                temp=temp.left;
25            return temp;
26        }else{
27            return pNode.next;
28        }
29    }
30}




你好!欢迎来到爪哇星球,期待在这里和你一起进步!欢迎关注、点赞、转发!