バイナリツリーを再構築する
- 事前順序走査シーケンスではルート ノードが最初に見つかります。
- 順序トラバーサル シーケンスでは、ルート ノードの値はシーケンスの中央にあり、ルート ノードの左側の番号は左側のサブツリーのノード、右側の番号は右側のサブツリーのノードです。。
- 事前順序走査シーケンスのルート ノードに従って、左右のサブツリーのノードを順序走査シーケンスで見つけることができます。
- 次に、すべてのノードが処理されるまで、左右のサブツリーが再帰的に処理されます。
/**
* 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;
}
};