演算法題(三十五):二叉樹的下一個結點

純潔的程式碼發表於2020-04-03

題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

分析
分情況討論:

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
原文:blog.csdn.net/qq_24034545…
版權宣告:本文為博主原創文章,轉載請附上博文連結!

更多學習資料可關注:gzitcast


相關文章