コンテンツ
2.ポストオーダーとインオーダーに従ってバイナリツリーを構築します
1.事前順序と順序に従って二分木を構築します
プレオーダーおよびインオーダートラバーサルに基づいてバイナリツリーを構築します
質問:ツリーのプレオーダーおよびインオーダートラバーサルを前提として
inorder,
、バイナリツリーを構築し、そのルートノードを返してください。例えば:
。
上記のリンクをクリックしてトピックを表示できます。具体的な方法は次のとおりです。
分析:ルートノードはプレオーダートラバーサルから取得でき、フォローノードの左右のサブツリー部分はインオーダーから取得できます。バイナリツリーを構築するとき、プレオーダーからルートを見つけてから、最初に、ルートの左と右のサブツリー部分を順番に作成します。ルートノードを作成してから、ルートの左のサブツリーとルートの右のサブツリーをそれぞれ作成します。このプロセスは再帰であり、各再帰で、新しいルートを見つけるために。
注:プレオーダーシーケンスはroot --- left --- rightであるため、復元する場合はroot --- left --- rightであるため、index ++が確立され、indexがプレオーダーマークのルートになり、インデックスが開始されます。事前注文の最初から最後まで
具体的な手順:
1.プレオーダートラバーサルでルートを見つけます
2.順序どおりの走査でルートを見つけ、境界点をposでマークします。posの左と右の部分は、再帰的な左検索と再帰的な右検索です。
3.最初にルートノードを復元し、次にルートの左側のサブツリーを再帰的に復元し、次にルートの右側のサブツリーを再帰的に復元します
4.再帰的復元は、範囲を順序どおりの走査で割ったものに基づいています
参照コード:
class Solution {
int index = 0; //标记前序的根
public TreeNode buildTree(int[] preorder, int[] inorder) {
return reBuildTree(preorder,inorder,0,inorder.length);
}
public TreeNode reBuildTree(int[] preorder,int[] inorder,int left,int right){
//递归返回条件
if(index>=preorder.length || left>=right){
return null;
}
int pos = left;
//在中序中找根的位置
while(pos < right){
if(inorder[pos] == preorder[index]){
break;
}
pos++;
}
TreeNode root = new TreeNode(preorder[index]);//还原根
index++;
root.left = reBuildTree(preorder,inorder,left,pos);//递归还原左
root.right = reBuildTree(preorder,inorder,pos+1,right);//递归还原右
return root;
}
}
2.ポストオーダーとインオーダーに従ってバイナリツリーを構築します
質問:ツリーのインオーダートラバーサルとポストオーダートラバーサルに基づいてバイナリツリーを構築します。
例えば:
。
上記のリンクをクリックしてトピックを表示できます。具体的な方法は次のとおりです。
分析:ポストオーダートラバーサルはルートノードを決定でき、インオーダートラバーサルはルートノードの左右のサブツリーを取得できるため、インオーダートラバーサル内のルートノードの位置も見つけて、posでマークしますこれらの2つの部分では、ルートの左側のサブツリーとルートの右側のサブツリーがそれぞれ再帰的に構築されます。
注:後続のトラバーサルはleft --- right --- rootであるため、復元時に逆方向に復元します。復元の順序は次のとおりです。root --- right --- left、つまりindex--が確立され、indexはルートに続くマークは、次の最後から最初に移動します
具体的な手順:
1.後続のトラバーサルからルートを見つけます
2.順序のルート位置を見つけ、posマークを使用して順序トラバーサルを2つの部分に分割します
3.posトークンの右側にあるルートの右側のサブツリーを再帰的に復元します
4.posトークンの左側にあるルートの左側のサブツリーを再帰的に復元します
参照コード:
class Solution {
int index; //标记后序遍历的根
public TreeNode buildTree(int[] inorder, int[] postorder) {
index = postorder.length-1; //后续的根
return reBuildTree(inorder,postorder,0,inorder.length);
}
public TreeNode reBuildTree(int[] inorder,int[] postorder,int left,int right){
//递归返回条件
if(index < 0 || left >= right){
return null;
}
//在中序遍历中找到根的位置
int pos = left;
while(pos < right){
if(postorder[index] == inorder[pos]){
break;
}
pos++;
}
//还原根
TreeNode root = new TreeNode(postorder[index]);
index--;
root.right = reBuildTree(inorder,postorder,pos+1,right); //还原根的右
root.left = reBuildTree(inorder,postorder,left,pos); //还原根的左
return root;
}
}