【劍指offer】二叉樹的下一個結點

題目

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

題解

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. 複雜度

時間複雜度:O(n)O(n)
空間複雜度:O(n)O(n)

2. 直接找下一結點

1. 分析

以該二叉樹爲例,中序遍歷爲:{D,B,H,E,I,A,F,C,G}

仔細觀察,可以把中序下一結點歸爲幾種類型:

  1. 有右子樹,下一結點是右子樹中的最左結點,例如 B,下一結點是 H
  2. 無右子樹,且結點是該結點父結點的左子樹,則下一結點是該結點的父結點,例如 H,下一結點是 E
  3. 無右子樹,且結點是該結點父結點的右子樹,則我們一直沿着父結點追朔,直到找到某個結點是其父結點的左子樹,如果存在這樣的結點,那麼這個結點的父結點就是我們要找的下一結點。例如 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. 複雜度:

時間複雜度:O(n)O(n)
空間複雜度:O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章