題集 二叉樹的遍歷各類題型彙總

2022-05-08 13:39:09 字數 3129 閱讀 8906

例1:給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。

#includeusing namespace std;

const int maxn = 100 + 10;

int post[maxn], in[maxn];

int lchild[maxn], rchild[maxn];

vectorans;

int dfs(int pl, int pr, int il, int ir, int root)

void bfs(int root)

}int main()

for(int i = 0; i < n; ++i)

int root = post[n - 1];

dfs(0, n - 1, 0, n - 1, root);

bfs(root);

int len = ans.size();

for(int i = 0; i < len; ++i)

return 0;

}

例2:已知前序遍歷和中序遍歷,求後序遍歷。

#includeusing namespace std;

const int maxn = 50000 + 10;

int pre[maxn], in[maxn];

vectorans;

void dfs(int pl, int pr, int il, int ir, int root)

int main()

for(int i = 0; i < n; ++i)

int root = pre[0];

dfs(0, n - 1, 0, n - 1, root);

printf("%d\n", ans[0]);

return 0;

}

另一種做法:

因為輸出的是後序遍歷(左右中)第乙個元素,因此對於某元素,

如果有左子樹的話,就不用研究右子樹了;

如果沒有左子樹,就研究右子樹;

如果左右子樹都沒有,就研究他本身。(遇到的第乙個葉子結點就是答案)

#includeusing namespace std;

const int maxn = 50000 + 10;

int pre[maxn], in[maxn];

mapmp;

void dfs(int pl, int pr, int il, int ir, int root)

else if(ir != id)

else

}int main()

for(int i = 0; i < n; ++i)

int root = pre[0];

dfs(0, n - 1, 0, n - 1, root);

return 0;

}

例3:已知前序遍歷和後序遍歷,求中序遍歷。

思路:前序遍歷的第乙個元素是根。

若只有左子樹,則前序遍歷的第二個元素和後序遍歷的倒數第二個元素相同,且都是左子樹的根;

若只有右子樹,則前序遍歷的第二個元素和後序遍歷的倒數第二個元素相同,且都是右子樹的根;

若既有左子樹又有右子樹,則前序遍歷的第二個元素是左子樹的根,後序遍歷的倒數第二個元素是右子樹的根;

即,若前序遍歷的第二個元素和後序遍歷的倒數第二個元素相同,則對於當前根結點來說有兩種可能,要麼只有左子樹,要麼只有右子樹。這兩種情況下,前序遍歷是相同的,後序遍歷也是相同的,但中序遍歷不同。

(1)求任意一種中序遍歷。

#include#include#includeusing namespace std;

const int maxn = 30 + 10;

int pre[maxn], pos[maxn];

int cnt;

mapmp1;

mapmp2;

vectorans;

void dfs(int prl, int prr, int pol, int por, int root)

int tmp1 = pre[prl + 1];

int tmp2 = pos[por - 1];

if(tmp1 != tmp2)

else

}int main()

for(int i = 0; i < n; ++i)

int root = pre[0];

dfs(0, n - 1, 0, n - 1, root);

if(cnt >= 1) printf("no\n");

else printf("yes\n");

int len = ans.size();

for(int i = 0; i < len; ++i)

return 0;

}

(2)求中序遍歷可能的種數。

思路:運算結果涉及高精度計算。

#include#include#includeusing namespace std;

const int maxn = 10000 + 10;

const int mod = 1000000000;

int pre[maxn], pos[maxn];

int cnt;

mapmp1;

mapmp2;

int ans[maxn];

void dfs(int prl, int prr, int pol, int por)

else

}void solve(int n, int k)

for(int i = 1; i <= len; ++i)

if(ans[len + 1]) ++len;

}for(int i = len; i >= 1; --i)

printf("\n");

}int main()

for(int i = 0; i < n; ++i)

dfs(0, n - 1, 0, n - 1);

solve(2, cnt);//計算2的cnt次方,不取模

return 0;

}

二叉樹題型彙總

題目描述 分別按照二叉樹先序,中序和後序列印所有的節點。輸入 返回 1,2,3 2,1,3 2,3,1 思路 建立返回vector,vector的0號元素放在左右子樹遍歷之前,vector1號元素放在左右子樹遍歷之間,vector2號元素放在左右子樹遍歷之後 class solution vecto...

二叉樹的各類遍歷

include include include include define maxn 1111 using namespace std struct bintree bintree build bintree t void preorder bintree t 前序遍歷遞迴 void inorde...

二叉樹遍歷方式彙總

include using namespace std struct bitreenode bitreenode init tree vector nums else return root void pre order r bitreenode root void in order r bitre...