[牛客0042-Leetcode]#树zhongconstruct-binary-tree-from-preorder-and-inorder-traversal

プレオーダートラバーサルとインオーダートラバーサルを使用して、コンストラクト-binary-tree-from-preorder-and-inorder-traversalコンストラクト-binary-tree-from-preorder-and-inorder-traversal

タイトル説明

ツリーのプレオーダートラバーサルとミドルオーダートラバーサルを考慮して、このバイナリツリーを構築してください。
注:ツリーに
重複ノードがないと想定できます

ツリーのプレオーダーおよびインオーダートラバーサルが与えられた場合、バイナリツリーを構築します。
注:
ツリーに重複が存在しないと想定する場合があります。

例1
入力

[1,2]、[1,2]

出力

{1、#、2}

例2の
入力

[1,2,3]、[2,3,1]

出力

{1,2、#、#、3}

問題解決のアイデア

プレオーダートラバーサルのルートノードを使用してミドルオーダートラバーサル内のルートノードの位置を見つけるたびに、配列は左右のサブツリーの2つの部分に分割され、トラバーサルが続行されます。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
    
    
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        int size = preorder.size();
        return build(preorder, 0, size - 1, inorder, 0, size - 1);
    }
    TreeNode* build(vector<int>& preorder, int preStart, int preEnd,
                   vector<int>& inorder, int inStart, int inEnd) {
    
    
        if(preStart > preEnd) return NULL;
        //将前序遍历中的根节点的值创建为一个新的节点
        TreeNode* root = new TreeNode(preorder[preStart]);
        //如果仅剩根节点,直接返回
        if(preStart == preEnd) return root;
        //在中序遍历中,根据前序遍历找到根节点的位置
        int rootIndex;
        for(int i = inStart; i <= inEnd; i ++) {
    
    
            if(preorder[preStart] == inorder[i]) {
    
    
                rootIndex = i;  //找到根节点位置后保存
                break;
            }
        }
        int length = rootIndex - inStart;  //左子树的数组长度
        root -> left = build(preorder, preStart + 1, preStart + length, inorder, inStart, rootIndex - 1);
        root -> right = build(preorder, preStart + length + 1, preEnd, inorder, rootIndex + 1, inEnd);
        return root;
    }
};

おすすめ

転載: blog.csdn.net/cys975900334/article/details/106868506