二叉樹面試題

2021-08-11 15:43:33 字數 2737 閱讀 4029

1.求二叉樹節點個數

可以使用遞迴解決。將問題分解為求根節點+左子樹的節點數+右節點的節點數。

實現 :

public:

size_t _size()

private:

size_t size(node *root)

2.求頁節點個數

頁節點:左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點時,返回 1,累加起來。

實現:

public:

size_t _leafsize()

private:

size_t leafsize(node *root)

3.求第k層節點個數

在求第 k 層節點個數時,可能會出現所求的第 k 層大於實際二叉樹的層數。

實現

public:

size_t _levelsize(size_t k) //封裝

private:

size_t levelsize(node *root, size_t k, size_t n)//求第k層節點數

if (n < k -

1) if (n == k -

1) return

0; }

4.求二叉樹深度/高度

在求二叉樹深度的時候,可以將問題分解為求根節點的左子樹和右子樹的深度的最大值 + 1。所以需要對左子樹和右子樹的深度進行判斷,返回較大的。

實現

public:

size_t depth()

private:

size_t _depth(node *root)

if (_depth(root->leftchild) > _depth(root->rightchild))

return

1+_depth(root->leftchild);

else

return

1+_depth(root->rightchild);

}

5.查詢節點

可以使用遞迴對整個二叉樹進行遍歷,如果碰到則返回該節點位置。

實現:

public:

node *find(const t& x)

private:

node* _find(node *root , const t&x)

6.將二叉樹映象

將二叉樹映象也就是將二叉樹進行翻轉。

可以使用佇列,從上向下將每個元素的左右子樹進行交換。

也可以使用遞迴,從下向上就行翻轉。

迴圈思想

實現

public:

void mirrortree() //非遞迴求映象

private:

void _mirrortree(node *root) //封裝呼叫

}

遞迴思想

實現

public:

void mirrortreer() //遞迴二叉樹映象

private:

void _mirrortreer(node *root) //封裝呼叫

7.判斷一顆二叉樹是不是完全二叉樹

完全二叉樹:前n個節點與該樹的滿二叉樹相同。

可以使用佇列對二叉樹進行遍歷。

如果二叉樹存在左右子樹,則對左右子樹進行壓棧。

此時會出現4中情況

(1) 左右子樹都存在

此時應該將根節點的左右子樹入隊,並將根結點的出隊。

(2) 左子樹存在,右子樹不存在

此時應該將左節點入隊並退出迴圈進行判斷,佇列中剩餘元素是否存在子節點,如果存在則不是完全二叉樹。

(3) 右子樹存在,左子樹不存在

此時,此顆二叉樹肯定不是完全二叉樹。

(4) 左右子樹都不存在

此時應該直接退出迴圈,對佇列中剩餘的所有子樹進行判斷。

實現

bool iscomplatetree()

else

if (front->leftchild)

else

if (front->rightchild) //左空右不空,肯定不是完全二叉樹

return

false;

else

//左右都為空

break; //對佇列中剩下的元素進行判斷

}

while (!q.empty())

return

true;

}

面試題 二叉樹

面試題 二叉樹 1.重建二叉樹 前序 中序 treenode reconstructbinarytree vector pre,vector vin treenode root new treenode pre 0 int pos 0 for pos pre left,vin left,pre ri...

二叉樹 面試題2

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序遍歷 dlr 中序遍歷 ldr 重建過程用遞迴演算法比較簡單 public static treenode reconstruc...

面試題 重建二叉樹

首先看到該題目,我們心裡應該清楚二叉樹的前序遍歷和中序遍歷各自有什麼特點,想不通的話可以在紙上畫一畫。前序遍歷序列中第乙個數字總是該二叉樹的根節點,但是在中序遍歷序列中根節點在中間,結合兩個序列,我們很容易就能知道二叉樹的根節點以及左右子樹,如下圖所示 依照這種方法,第二遍查詢根節點為2,那麼在左子...