您的位置:首页 > Web前端

剑指offer52--找到二叉树下一个结点

2016-07-28 13:35 459 查看


一、题目




题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父节点的指针。


二、举例



如上图所示其中序的遍历结果是:10-4-2-5-1-6-7-9-8-3

(1)2 的下一个元素是:5

(2)4 的下一个元素是:2

(3)8 的下一个元素是:3


三、思想

(1)当结点有右子树的这种情况,也就是如图中结点“2”的下一个结点是“5”

(2)当结点没有右子树,但是是父结点的右子结点,这种情况下其下一个结点就是父结点,如“4”的下一个结点是“2”

(3)当结点没有右子树同时是父结点的左结点情况时,然后就一直往上推,直到某个结点如图中的“6”是父结点“3”的左结点,

其下一个结点就是这个父结点,如“8”的下一个结点是“3”


四、程序

package 剑指offer;

public class Test58 {
public static BinaryTreeNodeNext findNextNode(BinaryTreeNodeNext node){
if(node == null){
return null;
}

BinaryTreeNodeNext target = null;
//[1]如果其右子树不为空,那么查找其右子树的做孩子
if(node.right != null){
target = node.right;
while(target.left != null){
target = target.left;
}
return target;
}

//[2]如果没有右子树,找到其父节点,分情况讨论
else if(node.parent != null){
target = node.parent;
BinaryTreeNodeNext current = node;

// 结点既没有右子树,也还是父结点的右结点的时候,一直向上找,直到找到一个结点是父结点的左子树
while(target != null && target.left != current){
current = target;
target =  target.parent;
}
return target;
}
return null;
}

private static void assemble(BinaryTreeNodeNext node,
BinaryTreeNodeNext left,
BinaryTreeNodeNext right,
BinaryTreeNodeNext parent) {
node.left = left;
node.right = right;
node.parent = parent;
}

public static void main(String args[]){
//                            1
//                  2                   3
//             4         5          6          7
BinaryTreeNodeNext n1 = new BinaryTreeNodeNext(1);
BinaryTreeNodeNext n2 = new BinaryTreeNodeNext(2);
BinaryTreeNodeNext n3 = new BinaryTreeNodeNext(3);
BinaryTreeNodeNext n4 = new BinaryTreeNodeNext(4);
BinaryTreeNodeNext n5 = new BinaryTreeNodeNext(5);
BinaryTreeNodeNext n6 = new BinaryTreeNodeNext(6);
BinaryTreeNodeNext n7 = new BinaryTreeNodeNext(7);

assemble(n1, n2, n3, null);
assemble(n2, n4, n5, n1);
assemble(n3, n6, n7, n1);
assemble(n4, null, null, n2);
assemble(n5, null, null, n2);
assemble(n6, null, null, n3);
assemble(n7, null, null, n3);

System.out.println("n1 next :"+findNextNode(n1));
System.out.println("n2 next :"+findNextNode(n2));
System.out.println("n3 next :"+findNextNode(n3));
System.out.println("n4 next :"+findNextNode(n4));
System.out.println("n5 next :"+findNextNode(n5));
System.out.println("n6 next :"+findNextNode(n6));
System.out.println("n7 next :"+findNextNode(n7));
}
}

class BinaryTreeNodeNext{
int value;
BinaryTreeNodeNext left;
BinaryTreeNodeNext right;
BinaryTreeNodeNext parent;

public BinaryTreeNodeNext() {
// TODO Auto-generated constructor stub
}
public BinaryTreeNodeNext(int value){
this.value = value;
}

public String toString(){
return value+"";
}
}
-----------------output--------------------
n1 next :6
n2 next :5
n3 next :7
n4 next :2
n5 next :1
n6 next :3
n7 next :null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息