1. 程式人生 > >前序遍歷和中序遍歷樹構造二叉樹

前序遍歷和中序遍歷樹構造二叉樹

fin traversal dtree 構造二叉樹 div integer break param val

根據前序遍歷和中序遍歷樹構造二叉樹

樣例:

給出中序遍歷:[1,2,3]和前序遍歷:[2,1,3]. 返回如下的樹:

2

/ \

1 3

我們知道前序遍歷是中->左->右,中序遍歷是左->中->右。因此根據前序遍歷的第一個數,即為根節點,我們可以在中序遍歷中找到根節點的左子樹和右子樹,同樣遞歸在左子樹中找到左子樹的根節點和其左右子樹,對右子樹也一樣。這樣理清思路後代碼就不難寫出來了。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
 

class Solution {
    /**
     [email protected]
/* */ preorder : A list of integers that preorder traversal of a tree [email protected] inorder : A list of integers that inorder traversal of a tree [email protected] : Root of a tree */ public: TreeNode *construct(vector<int> &preorder, vector<int> &inorder, int ps, int pe, int is, int ie) { TreeNode * root = new TreeNode(preorder[ps]); if (ps == pe) return root; int i; for (i = 0; i < ie; i++) { if (inorder[i] == root->val) break; //找到根節點位置 } //遞歸構造左右子樹 if (is <= i-1) root->left = construct(preorder, inorder, ps+1, ps+(i-is), is, i-1); if (i+1 <= ie) root->right = construct(preorder, inorder, ps+(i-is)+1, pe, i+1, ie); return root; } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { if (preorder.empty() || inorder.empty() || preorder.size() != inorder.size()) return NULL; return construct(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1); } };

前序遍歷和中序遍歷樹構造二叉樹