二叉樹作為基本的資料結構,在一些演算法面試中會經常遇到,現總結如下。基本演算法思想就不介紹了,**中關鍵處會有注釋。程式全以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 ...