二叉树的建树

1. 已知前序与中序来建树

acwing版本:
字符串形式

#include <iostream>
#include <string>

using namespace std;
string pre, in;

void dfs(string pre,string in)
{
    if(pre.empty()) return ;
    char a = pre[0];
    int k = in.find(a);
    dfs(pre.substr(1,k), in.substr(0,k));
    dfs(pre.substr(k + 1), in.substr(k + 1));
    cout << a;
}

int main()
{
    while(cin >> pre >> in)
    {
        dfs(pre,in);
        puts("");
    }
    return 0;
}

leetcode版本:
数组储存版本

class Solution {
public:
    unordered_map<int,int> map_;
    TreeNode* dfs(vector<int>& pre, vector<int>& in,int a,int b,int c,int d)
    {
        if(a>b) return NULL; 
        int ro = pre[a];
        int k = map_[ro];
        TreeNode* root = new TreeNode(ro);
        root -> left = dfs(pre, in, a + 1, a + k - c, c, k - 1);
        root -> right = dfs(pre, in, a + k - c + 1, b, k + 1, d);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int n = inorder.size();
        for(int i = 0 ; i < n ; i ++) map_[inorder[i]] = i;
        return dfs(preorder,inorder,0,n - 1,0,n - 1);
    }
};

注意:出口条件当pre或者in内无元素返回空指针

2. 按照带标记序号的x序进行建树

😂首先可以学习一下leetcode建树节点的步骤

struct TreeNode
{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode():val(0),left(nullptr),right(nullptr){}
	TreeNode(int x):val(x),left(nullptr),right(nullptr){}
	TreeNode(int x,TreeNode *l,TreeNode* r):val(x),left(l),right(r){}
}

首先说明:

  • 先序与后序是有可能建树的,但是中序不太可能
  • 后序只要从最后一个字母/数字开始建树,就和前序几乎一样,不过这里是\(\color{Red}{根->右->左}\)

这方面的模板大同小异,这或许算是简洁的一种。

TreeNode* build()
{
    char val;
    cin >> val;
    TreeNode *n;
    if(val != '#')
    {
        n = new TreeNode(val);
        n -> left = build();
        n -> right = build();
    }
    else n = nullptr;
    return n;
}

检验oj

posted @ 2022-11-13 23:50  绊缘  阅读(8)  评论(0)    收藏  举报