以下二叉樹的結點型別如下:
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的結點 判斷乙個...