ご注文後、バイナリツリートラバーサルを達成するための再帰的な方法、それは簡単である前に、我々は唯一の機能スタックが自動的に私たちは、複雑な操作を実行するのに役立ちます、非常に単純な再帰的なステートメントを使用する必要があります。フロント後順トラバーサルバイナリツリーの非再帰的方法を使用して、本質的にシミュレーションヒト機能スタックにスタックを作成します。
1.前順トラバーサル非再帰的
-
スタック・アプリケーション・スタック、スタックは、ヘッドノードに押し込まれます。
-
(空でない)、スタック、印刷からその右の子ノードをスタックノードをポップはスタックに押し込まれ、(空でない場合)、最終的にはその左の子ノードにスタックに押し込まれます。
-
スタックが空になるまでステップ2は、全体の処理を終了繰り返されます。
private static void firstSearch(TreeNode t){
Stack<TreeNode> stack = new Stack<>();
// 先放根,然后pop出来放右节点和左节点,然后重复上述操作
stack.push(t);
while(!stack.isEmpty()){
TreeNode temp = stack.peek();
stack.pop();
System.out.println(temp.val);
if(temp.right != null){
stack.push(temp.right);
}
if(temp.left != null){
stack.push(temp.left);
}
}
}
非再帰的トラバーサルを達成するために2
-
スタックスタックを適用し、最初の季節CUR =ヘッド
-
最初のスタックにプッシュCUR、左境界を順次スタックにプッシュされ、即ち、T = t.leftを作るために維持、繰り返しは2ステップ
-
まで繰り返さ2はヌル、スタックからポップノード、ノードと呼ばれる、プリントのノード値、およびt = node.right、反復ステップせている2
-
スタックが空であり、tが空になると、プロセスが停止します。
private static void midSearch(TreeNode t){
Stack<TreeNode> stack = new Stack<>();
// 首先不断入栈顶节点的左节点,直到入不了为止,然后pop出栈顶节点,入一个右节点,然后入该右节点的左子节点直到
// 入不了为止,重复上述步骤
if(t != null){
while(t != null || !stack.isEmpty()){
if(t != null){
stack.push(t);
t = t.left;
}else{
System.out.println(stack.peek().val);
t = stack.pop().right;
}
}
}
}
3.非再帰後順
-
スタックS1、S1のスタックに、次にヘッドノードを適用します。
-
その後、ポップ-S1一時、一時として記録ノードから左の子ノードと押し込ま右の子ノードS1をオンにします。
-
プロセスを通じて、各ノードはS1から排出され、S2が置かれています。
-
s1が空になるまで、ステップ2および3を繰り返して、プロセスが停止します。
-
順次プリントノードとS2から吐出され、注文後の印刷順序が横断しています。
private static void lastSearch(TreeNode t){
// 仿照先序遍历的相反顺序,但是pop出来后需要放入另一个栈中
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(t);
while(!stack1.isEmpty()){
TreeNode temp = stack1.peek();
stack2.push(stack1.pop());
if(temp.left != null){
stack1.push(temp.left);
}
if(temp.right != null){
stack1.push(temp.right);
}
}
while(!stack2.isEmpty()){
System.out.println(stack2.pop().val);
}
}