二叉樹經典面試題

2021-08-01 03:09:13 字數 2965 閱讀 7455

以下二叉樹的結點型別如下:

templatet>  

struct binarytreenode

};

求二叉樹中兩個節點的最近公共祖先

分析:

求兩個結點的最近公共祖先有兩種情況。

1、如果這兩個結點不在一條線上,則它們就分別在最近的公共祖父的左右子樹上。

2、如果這兩個結點在一條線上,則它們之中深度最前的就是他們的最近的公共祖先。

方法1:

分別將兩個結點的路徑儲存到兩個陣列中,然後比較這兩個陣列中的元素,第乙個不相等的元素的前乙個元素就是最近的公共結點。

例:

1、求2和3的最近的公共祖先

2的路徑是:1 2

3的路徑是:1 2 3

第三個元素不相同,所以最近的公共祖先是第二個元素,也就是2。

2、求3和5的最近公共結點

3的路徑:1 2 3

5的路徑:1 4 5

第2個元素不同,所以最近的公共結點是第乙個元素,也就是1。

void _getancestor(binarytreenode* root,  

binarytreenode* node,

vector

int>* >& v,int &flag)

} binarytreenode* getancestor(binarytreenode* root,

binarytreenode* node1,

binarytreenode* node2)

else

} if (rv1 == v1.rend() && rv2 != v2.rend())

return node1;

if (rv1 != v1.rend() && rv2 == v2.rend())

return node2;

return null;

}

求二叉樹中最遠的兩個節點的距離

分析:

1、如果具有最遠距離的兩個結點之間的路徑經過根結點,則最遠距離就是這個根節點左邊的深度加上根節點的右邊的深度。

2、如果具有最遠距離的兩個結點之間的路徑不經過根節點,則最遠距離的結點就在根節點的某一棵子樹上的兩個葉子結點。

使用distance記錄這個最遠的距離。後序遍歷二叉樹中每乙個結點,對於每乙個結點先算出左邊和右邊的深度和然後與distance裡面的資料進行比較,如果結果大於distance則更新distance的值。這種方法的時間複雜度是o(n)。

int _getfarthestdistance(binarytreenode* root, int& distance)  

int getfarthestdistance(binarytreenode* root) //得到二叉樹中距離最遠的兩個結點之間的距離

由前序遍歷和中序遍歷重建二叉樹(如:前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)

分析:

先序遍歷:訪問當前結點,訪問左子樹,訪問右子樹.

中序遍歷:訪問左子樹,訪問當前結點,訪問右子樹.

可以發現,前序遍歷的每一結點,都是當前子樹的根節點,我們可以根據前序遍歷的序列對中序遍歷的序列進行劃分。

如圖:

上面的分析只是針對於當樹中沒有重複出現的元素的情況,當有重複出現的元素的時候,要考慮到樹的結構可能不唯一。

void creatsubtree(binarytreenode* &root,  

int* inorder,

int *prevorder,

int len)

int subtreel =index; //左子樹結點個數

int subtreer = len - index - 1; //右子樹結點個數

creatsubtree(root->_left, inorder, prevorder + 1, subtreel);

creatsubtree(root->_right,inorder + index + 1, prevorder + index + 1, subtreer);

} binarytreenode* rebuildbinarytree(int *inorder, int *prevorder, int len)

判斷一棵二叉樹是否是完全二叉樹

將二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調 整樹中結點指標的指向。

分析:

二叉搜尋樹在中序遍歷的時候是有序的,而且每乙個結點都有左指標和右指標。我們可以讓左指標left充當雙向鍊錶中的prev,右指標充當雙向鍊錶中的next。

我們可以中序遍歷這棵樹,將中序得到的序列都儲存到佇列裡面,然後再把佇列裡面的結點鏈結成一條鍊錶,這樣的話這條鍊錶就是有序的了。

void _inorder(node* root,queue

int> *>& q)

void treetolist(node* root)

}

經典二叉樹面試題

包括建立銷毀二叉樹,層序遍歷二叉樹,求二叉樹的葉子節點,求二叉樹第 k層的節點個數,求二叉樹的高度等 include include template struct binarytreenode template class binarytree 建構函式 binarytree const t a,...

二叉樹經典面試題

二叉樹的結點型別如下 typedef struct btnode btnode,binarytree 1.給你一顆普通的二叉樹,求二叉樹中最遠的兩個節點的距離分析 1 如果具有最遠距離的兩個結點之間的路徑經過根結點,則最遠距離就是這個根節點左邊的深度加上根節點的右邊的深度。2 如果具有最遠距離的兩個...

二叉樹的經典面試題

二叉樹的基本操作 二叉樹的遍歷 前 中 後 層,遞迴 非遞迴 中用到的棧 中用到的佇列 面試題拷貝二叉樹 判斷一棵二叉樹是否是完全二叉樹 二叉樹的映象遞迴 二叉樹的映象非遞迴 求二叉樹中結點的個數 獲取二叉樹中葉子結點的個數 求二叉樹中k層結點的個數 求二叉樹的高度 查詢值為data的結點 判斷乙個...