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,那麼在左子...