二叉樹的常見演算法1

2021-07-14 20:18:54 字數 2033 閱讀 8717

struct treenode

};

給你一串字串,每個節點用『,』隔開,用『#』代表空的字串。按從上到下的順序給出字串。

例如:

字串—1,2,#,3,4對應的二叉樹為:

根據『,』的位置分離出每乙個節點,儲存在vector陣列中。

建立每乙個節點的指標關係。

// index記錄的是i的子樹的位置

while (index < path.size())

i++;

}return path[0];

}題2的映象問題,給你一顆二叉樹,將其還原成字串。

這裡我是按層次遍歷的方法寫的,如果有疑問,可以轉到層次遍歷二叉樹

string serialize(treenode *root) 

}int i = ans.size()-1;

while(i >= 0)

}return ans.substr(1,i);

}

前序遍歷的訪問順序是 根 -> 左 -> 右

void preorder(treenode *root, vector

&ans)

}

利用棧的fifo性質,先訪問棧的頂層節點,然後先把當前節點的右子樹入棧,再把當前節點的左子樹入棧。當棧不為空的時候繼續訪問棧。

void preorder2(treenode *root, vector

&ans)

}

中序遍歷的訪問順序: 左 -> 根 -> 右

void inorder(treenode *root,vector

&ans)

}

對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。

對於任一結點p,

若其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前結點p再進行相同的處理;

其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的p置為棧頂結點的右孩子;

直到p為null並且棧為空則遍歷結束

void inorder2(treenode *root,vector

&ans)

if (!s.empty()) }}

後序遍歷的訪問順序: 左 -> 右 -> 根

void postorder(treenode *root,vector

&ans)

}

要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

參考海子的部落格:部落格位址

void postorder2(treenode *root,vector

&ans)

else }}

演算法筆記 二叉樹1

樹 先看圖 通過上面的圖,可以很直觀的理解以下概念 根節點,子節點,兄弟節點,葉子節點。沒有父節點的節點叫做根節點,比如節點 23。擁有相同的父節點的節點,稱之為兄弟節點,比如節點 13 和節點 54。沒有子節點的節點叫做葉子節點,比如節點 10,節點 28 等。層級 如圖所示,從 1 層開始,自上...

基礎演算法之二叉樹 1 平衡二叉樹的判斷

平衡二叉樹指的是二叉樹的每乙個節點的左子樹和右子樹的高度差為不大於1 每乙個子樹如果有乙個出現不是平衡二叉樹的話就一定不是平衡二叉樹如果遍歷得到的某乙個節點出現了,二叉樹的高度之差大於1也不是二叉樹每次遍歷之後都要返回左右子樹的深度如果該節點滿足二叉樹的要求,該二叉樹的深度就是它下面最高的子樹的大小...

常見演算法之17 二叉樹相等判斷以及二叉樹的複製

題目 輸入一顆二叉樹根節點,複製該樹,返回新建樹的根節點。分析 跟求二叉樹的高度類似,使用遞迴呼叫,先序遍歷即可完成。bnode copybst bnode root 題目 判斷兩顆二叉樹是否相等。注意 1.root1和root2相等。2.root1的左右子樹與root2的左右子樹分別相同。分析 按...