//在二叉树中找到一个节点的后继节点
public class getNextNode{
//节点的定义
public static class Node{
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int data)
{
this.value=data;
}
}
//给定一个节点获得其后继节点
public static Node getNextNode(Node node)
{
//
if(node==null)
{
return node;
}
//如果有子树,那么后继节点就是右子树上最左边的节点
if(node.right!=null)
{
return getLeftMost(node.right);
}//节点上移寻找父节点
else{
Node parent=node.parent;
while(parent!=null&&parent.left!=node)
{
node=parent;
parent=node.parent;
}
return parent;
}
}
public static Node getLeftMost(Node node)
{
if(node==null){
return node;
}
while(node.left!=null)
{
node=node.left;
}
return node;
}
public static void main(String[]args)
{
/**构造的二叉树
6
3 9
1 4 8 10
2 5 7
*/
Node head = new Node(6);
head.parent = null;
head.left = new Node(3);
head.left.parent = head;
head.left.left = new Node(1);
head.left.left.parent = head.left;
head.left.left.right = new Node(2);
head.left.left.right.parent = head.left.left;
head.left.right = new Node(4);
head.left.right.parent = head.left;
head.left.right.right = new Node(5);
head.left.right.right.parent = head.left.right;
head.right = new Node(9);
head.right.parent = head;
head.right.left = new Node(8);
head.right.left.parent = head.right;
head.right.left.left = new Node(7);
head.right.left.left.parent = head.right.left;
head.right.right = new Node(10);
head.right.right.parent = head.right;
Node test = head.left.left;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.left.left.right;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.left;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.left.right;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.left.right.right;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.right.left.left;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.right.left;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.right;
System.out.println(test.value + " next: " + getNextNode(test).value);
test = head.right.right; // 10's next is null
System.out.println(test.value + " next: " + getNextNode(test));
}
}
在二叉树中找到一个节点的后继节点
最新推荐文章于 2022-07-19 23:17:14 发布