day17 -- バイナリー ツリー

バイナリツリーを再構築する

  1. 事前順序走査シーケンスではルート ノードが最初に見つかります
  2. 順序トラバーサル シーケンスでは、ルート ノードの値はシーケンスの中央にあり、ルート ノードの左側の番号は左側のサブツリーのノード、右側の番号は右側のサブツリーのノードです。
  3. 事前順序走査シーケンスのルート ノードに従って左右のサブツリーのノードを順序走査シーケンスで見つけることができます
  4. 次に、すべてのノードが処理されるまで、左右のサブツリーが再帰的に処理されます
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
#include <vector>
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int len=pre.size();
        vector<int> pre_l, pre_r, vin_l, vin_r;
        if(len==0) return nullptr;
        TreeNode* head=new TreeNode(pre[0]);//根节点
        //在中序遍历中找到根节点
        int r;
        for(int i=0;i<len;i++){
            if(pre[0]==vin[i]){ r=i; break; }
        }
        //处理左子树
        for(int i=0;i<r;i++){
            pre_l.push_back(pre[i+1]);
            vin_l.push_back(vin[i]);
        }
        //处理右子树
        for(int i=r+1;i<len;i++){
            pre_r.push_back(pre[i]);
            vin_r.push_back(vin[i]);
        }
        head->left=reConstructBinaryTree(pre_l, vin_l);//递归处理左子树
        head->right=reConstructBinaryTree(pre_r, vin_r);//递归处理右子树
        return head;
    }
};

二分木の右側のビューを出力します

二分木を再構築し、左右のノードの数を比較します。右側が同じ/多い場合: 右側のみを保持します。左側が多い場合: より多くの部分と右側を保持します。 

#include <queue>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型vector 先序遍历
     * @param zhongxu int整型vector 中序遍历
     * @return int整型vector
     */
    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
        int len=xianxu.size();
        if(!len || len==1) return xianxu;
        vector<int> ans, pre_l,pre_r, lans, vin_l,vin_r, rans;
        ans.push_back(xianxu[0]);//根节点
        int root=xianxu[0], id;
        while(root!=zhongxu[id]) id++;
        for(int i=0;i<id;i++) pre_l.push_back(xianxu[i+1]), vin_l.push_back(zhongxu[i]);//左子树
        lans=solve(pre_l, vin_l);
        for(int i=id+1;i<len;i++) pre_r.push_back(xianxu[i]), vin_r.push_back(zhongxu[i]);//右子树
        rans=solve(pre_r, vin_r);
        int lsize=lans.size(), rsize=rans.size();
        if(lsize>rsize){//左边节点比右边多的部分在右边也能看见
            for(int i=0;i<lsize;i++){
                if(i<rsize) ans.push_back(rans[i]);
                else ans.push_back(lans[i]);
            }
        }else{//右边多则只能看有右边节点
            for(int i=0;i<rsize;i++) ans.push_back(rans[i]);
        }
        return ans;
    }
};

 

おすすめ

転載: blog.csdn.net/qq_54809548/article/details/131138858