題目內容:
我們知道如何按照三種深度優先次序來周遊一棵二叉樹,來得到中根序列、前根序列和後根序列。反過來,如果給定二叉樹的中根序列和後根序列,或者給定中根序列和前根序列,可以重建一二叉樹。本題輸入一棵二叉樹的中根序列和後根序列,要求在記憶體中重建二叉樹,最後輸出這棵二叉樹的前根序列。
用不同的整數來唯一標識二叉樹的每乙個結點。
輸入格式:
兩行。第一行是二叉樹的中根序列,第二行是後根序列。每個數字表示的結點之間用空格隔開。結點數字範圍0~65535。暫不必考慮不合理的輸入資料。
輸出格式:
一行。由輸入中的中根序列和後根序列重建的二叉樹的前根序列。每個數字表示的結點之間用空格隔開。
輸入樣例:
9 5 32 67
9 32 67 5
輸出樣例:
5 9 67 32
感覺演算法是錯的,但是只有乙個樣例,還是ac了
#include using namespace std;
struct tree
;int a[65536];
int b[65536];
int n;
void buildrighttree(tree*, int, int, int, int, int);
void buildlefttree(tree* root, int le, int ri, int rootnum, int lenl, int lenr)
root->left->val = b[rootnum - lenr - 1];
if (le == ri)
int k;
for (int i = 0; i < lenl; i++) }
buildlefttree(root->left, le, le + k - 1, rootnum - lenr - 1, k, lenl - k - 1);
buildrighttree(root->left, le + k + 1, ri, rootnum - lenr - 1, k, lenl - k - 1);
}void buildrighttree(tree* root, int le, int ri, int rootnum, int lenl, int lenr)
root->right->val = b[rootnum - 1];
if (le == ri)
int k;
for (int i = 0; i < lenr; i++) }
buildlefttree(root->right, le, le + k - 1, rootnum - 1, k, lenr - k - 1);
buildrighttree(root->right, le + k + 1, ri, rootnum - 1, k, lenr - k - 1);
}void dfs(tree* root)
int main()
c = getchar();
} for (int i = 0; i < n; i++)
int leftl;
int leftr;
int rightl;
int rightr;
tree* root = new tree;
root->val = b[n - 1];
for (int i = 0; i < n; i++) }
buildlefttree(root, leftl, leftr, n - 1, leftr - leftl + 1, rightr - rightl + 1);
buildrighttree(root, rightl, rightr, n - 1, leftr - leftl + 1, rightr - rightl + 1);
cout << root->val;
if (root->left->val != -1)
dfs(root->left);
if (root->right->val != -1)
dfs(root->right);
return 0;
}
由中序序列和前序序列重建二叉樹
definition for binary tree struct treenode class solution treenode construct vector pre,vector vin,int l1,int r1,int l2,int r2 int val pre l1 int inde...
由中序遍歷序列和前序遍歷序列重建二叉樹
在二叉樹中,中序遍歷是一種很常見的遍歷方式,首先遍歷左子樹,然後根節點,最後右子樹。前序遍歷是先遍歷根節點,然後左子樹,最後右子樹。我們知道,前序遍歷的第乙個數字就是根節點,由根節點的值我們在中序遍歷的序列中可以根據根節點的值區分出左子樹還有右子樹,以及每個子樹的結點的數目,然後我們由此在前序遍歷的...
由中序序列和後序序列確定一棵二叉樹
中序序列 int hou maxn 後序序列 struct node int n,m node create int houl,int hour,int inl,int inr int numleft i inl 看左邊是否還有節點 注意這裡沒有對numleft的數目進行判斷!root lchild...