二叉樹相關演算法總結實現

2021-10-08 02:16:02 字數 4112 閱讀 4060

二叉樹作為基本的資料結構,在一些演算法面試中會經常遇到,現總結如下。基本演算法思想就不介紹了,**中關鍵處會有注釋。程式全以c++語言實現,並跟乙個main函式的簡單測例。

struct treenode

};

二叉樹的最大深度

int

maxdepth

(treenode* root)

前序遍歷 遞迴

vector<

int>

preorder

(treenode* root)

void

preorder

(treenode* root, vector<

int>

&res)

前序遍歷 非遞迴

vector<

int>

preorder_

(treenode* root)

return res;

}

中序遍歷 遞迴

vector<

int>

inorder

(treenode* root)

void

inorder

(treenode* root, vector<

int>

&res)

中序遍歷 非遞迴

vector<

int>

inorder_

(treenode* root)if(

!sta.

empty()

)}return res;

}

後序遍歷 遞迴

vector<

int>

postorder

(treenode* root)

void

postorder

(treenode* root, vector<

int>

&res)

後序遍歷 非遞迴 實現1:

vector<

int>

postorder_

(treenode* root)

else

}return res;

}

後序遍歷 非遞迴 實現2:

vector<

int>

postorder_

(treenode* root)

// 將結果進行逆序

reverse

(res.

begin()

, res.

end())

;return res;

}

層序遍歷 實現1:

vector

int>

>

levelorder

(treenode* root)

return res;

}

層序遍歷 實現2:

vector

int>

>

levelorder

(treenode* root)

res.

push_back

(r);

}return res;

}

層序列印

void

printlevelordertreenode

(vector

int>

>

&ress)

}

前中後序列印

void

printordertreenode

(vector<

int>

&res)

中序後序遍歷重建二叉樹

treenode*

helperinpos

(vector<

int>

& inorder, vector<

int>

& postorder,

int instart,

int inend,

int postart,

int poend)

//i-instart是inorder中根結點到左邊起始點的距離

node-

>left =

helperinpos

(inorder, postorder, instart, i -

1, postart, postart + i - instart -1)

; node-

>right =

helperinpos

(inorder, postorder, i +

1, inend , postart + i - instart, poend -1)

;return node;

}treenode*

buildtreeinpos

(vector<

int>

& inorder, vector<

int>

& postorder)

前序中序遍歷重二叉樹

treenode*

helperprein

(vector<

int>

& preorder, vector<

int>

& inorder,

int prestart,

int preend,

int instart,

int inend)

treenode* node =

newtreenode

(preorder[prestart]);

int i;

for(i = instart; i <= inend; i++)}

node-

>left=

helperprein

(preorder, inorder, prestart +

1, prestart + i - instart, instart, i -1)

; node-

>right=

helperprein

(preorder , inorder, prestart + i - instart +

1, preend, i +

1, inend)

;return node;

}treenode*

buildtreeprein

(vector<

int>

& preorder, vector<

int>

& inorder)

main函式

int

main()

因為平時刷leetcode的緣故,加上以上部分演算法其實就是leetcode裡的原題,所以所有演算法我都放在了solution類中。以下以乙個簡單的最大深度的作為例子:

#include

"iostream"

#include

"vector"

#include

"queue"

#include

"stack"

#include

"algorithm"

using

namespace std;

struct treenode};

class

solution};

intmain()

完整的main函式的執行結果為:

以上所有**均上傳在我的github中github位址,後續會繼續總結其他資料結構的基礎演算法實現。

二叉樹相關演算法

節點 class node t public node t left public node t right public node t value,node t left,node t right public node t value this value,null null 二叉樹 前中後深度...

二叉樹遍歷相關演算法實現

include include include using namespace std typedef int elemtype typedef struct treet treet,ptreet class bitree ptreet bitree insert elemtype target,p...

二叉樹相關演算法 二

leetcode 437.path sum iii 第乙個想法就是遍歷二叉樹,找出每個節點的可能性。這個思路時間複雜度為o n 2 private int num public intpathsum treenode root,int sum private void recur treenode ...