例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...