劍指offer 面試題8 二叉樹的下乙個節點

2021-08-03 19:57:04 字數 1788 閱讀 3419

完整**位址

給定一棵二叉樹和其中的乙個節點, 如何找出中序遍歷的下乙個節點?

樹中的節點除了有兩個分別指向左、右節點的指標,還有乙個指向父節點的指標。

public

static

class treelinknode

}

首先判斷node是否有右子樹?

└─有右子樹則返回右子樹中最左的節點

└─沒有右子樹的話判斷node是否為父節點的左子節點?

└─是的話直接返回父節點

└─不是的話則沿著父節點往上(parent)尋找,直到某個節點node2,node2為其父節點node3的左子節點,返回node3

public

class

_08_nextnodeinbinarytrees

}/**

* 首先判斷node是否有右子樹?

* ->有右子樹則返回右子樹中最左的節點

* 沒有右子樹的話判斷node是否為父節點的左子節點?

* ->是的話直接返回父節點

* 不是的話則沿著父節點往上(parent)尋找,

* 直到某個節點node2,node2為其父節點node3的左子節點,返回node3

* *@param node 節點

*@return 中序遍歷的下乙個節點

*/public treelinknode getnext(treelinknode pnode)

// 是父節點的左子節點

if(pnode.next != null && pnode == pnode.next.left)

treelinknode cur = pnode;

while(cur.next != null && cur != cur.next.left)

// 遍歷到了根節點還是沒找到

if(cur.next == null)

return

null;

return cur.next;

}private treelinknode findleft(treelinknode pnode)

return cur;

}}

public

class

_08_test

/*** 1

* / \

* 2 3

* / \ / \

* 4 5 6 7

* / \

* 8 9

* * 有右子樹:2 -> 8

* 沒有右子樹 & 為父節點的左子節點: 6 -> 3

* 沒有右子樹 & 非父節點的左子節點: 7 -> null, 9 -> 1

* * 前序:1,2,4,5,8,9,3,6,7

* 中序:4,2,8,5,9,1,6,3,7

*/private

static

void

test1()

/*** 只有乙個節點

*/private

static

void

test2()

/*** 樹為空

*/private

static

void

test3()

}

《劍指Offer》面試題 平衡二叉樹

題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...

劍指Offer 面試題 樹和二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。基礎知識 在二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值。在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的...

《劍指Offer》面試題 二叉樹的深度

題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。思路 此題的遞迴思想比較簡單,直接用遞迴將根節點的深度轉換為求左右子孩子的深度的較大值 1,根節點的深度等於max 左孩子的深度,右孩子的深度 輸入 第一行輸入有n,n表...