題目
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
題解
1. 還原二叉樹
1. 分析
既然給了二叉樹的某個結點,且二叉樹存儲着指向父結點的指針(next),那我們可以先找到根節點,再對樹進行中序遍歷,最後根據中序遍歷結果找到給定結點的下一結點
2. 代碼
import java.util.*;
public class Solution {
static ArrayList<TreeLinkNode> list = new ArrayList<>();
public TreeLinkNode GetNext(TreeLinkNode pNode){
TreeLinkNode par = pNode;
while(par.next != null){
par = par.next;
}
InOrder(par);
for(int i=0;i<list.size();i++){
if(pNode == list.get(i)){
return i == list.size()-1?null:list.get(i+1);
}
}
return null;
}
void InOrder(TreeLinkNode pNode){
if(pNode!=null){
InOrder(pNode.left);
list.add(pNode);
InOrder(pNode.right);
}
}
}
3. 複雜度
時間複雜度:
空間複雜度:
2. 直接找下一結點
1. 分析
以該二叉樹爲例,中序遍歷爲:{D,B,H,E,I,A,F,C,G}
仔細觀察,可以把中序下一結點歸爲幾種類型:
- 有右子樹,下一結點是右子樹中的最左結點,例如 B,下一結點是 H
- 無右子樹,且結點是該結點父結點的左子樹,則下一結點是該結點的父結點,例如 H,下一結點是 E
- 無右子樹,且結點是該結點父結點的右子樹,則我們一直沿着父結點追朔,直到找到某個結點是其父結點的左子樹,如果存在這樣的結點,那麼這個結點的父結點就是我們要找的下一結點。例如 I,下一結點是 A;例如 G,並沒有符合情況的結點,所以 G 沒有下一結點
2. 代碼
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 1.
if (pNode.right != null) {
TreeLinkNode pRight = pNode.right;
while (pRight.left != null) {
pRight = pRight.left;
}
return pRight;
}
// 2.
if (pNode.next != null && pNode.next.left == pNode) {
return pNode.next;
}
// 3.
if (pNode.next != null) {
TreeLinkNode pNext = pNode.next;
while (pNext.next != null && pNext.next.right == pNext) {
pNext = pNext.next;
}
return pNext.next;
}
return null;
}
}
3. 複雜度:
時間複雜度:
空間複雜度: