樹的算法如下:非遞歸的算法中,中序和後續遍歷稍微難寫一些 ,需要多練。其餘的基本是模板方式,多橫向對比感受下。
import java.util.Stack;
public class SearchTree {
public static void main(String[] args) {
BinaryTreeNode root = new BinaryTreeNode(1);
root.left = new BinaryTreeNode(2);
root.left.left = new BinaryTreeNode(4);
root.left.left.left = new BinaryTreeNode(8);
root.left.left.right = new BinaryTreeNode(9);
root.left.right = new BinaryTreeNode(5);
root.left.right.left = new BinaryTreeNode(10);
root.right = new BinaryTreeNode(3);
root.right.left = new BinaryTreeNode(6);
root.right.right = new BinaryTreeNode(7);
System.out.println("先序遍歷的遞歸和非遞歸對比:");
noRecursionPreOrder(root);
System.out.println();
recursionPreOrder(root);
System.out.println();
System.out.println("中序遍歷的遞歸和非遞歸對比:");
noRecursionMidOrder(root);
System.out.println();
recursionMidOrder(root);
System.out.println();
System.out.println("後序遍歷的遞歸和非遞歸對比:");
noRecursionPostOrder(root);
System.out.println();
recursionPostOrder(root);
System.out.println();
}
// 遞歸版 --> 二叉樹(先序遍歷)
public static void noRecursionPreOrder(BinaryTreeNode node) {
// 1. 遞歸終止條件
if (node == null) return;
// 2. 處理當前層邏輯
System.out.print(node.data + " ");
// 3. 下挖一層
noRecursionPreOrder(node.left);
noRecursionPreOrder(node.right);
}
// 非遞歸版 --> 二叉樹(先序遍歷)
public static void recursionPreOrder(BinaryTreeNode root) {
if (root == null) {
return;
}
Stack<BinaryTreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
BinaryTreeNode node = stack.pop();
System.out.print(node.data + " ");
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
}
// 遞歸版 --> 二叉樹(中序遍歷)
public static void noRecursionMidOrder(BinaryTreeNode node) {
if (node == null) return;
noRecursionMidOrder(node.left);
System.out.print(node.data + " ");
noRecursionMidOrder(node.right);
}
// 非遞歸版 --> 二叉樹(中序遍歷)
public static void recursionMidOrder(BinaryTreeNode node) {
if (node == null) return;
Stack<BinaryTreeNode> stack = new Stack<>();
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.left;
} else {
node = stack.pop();
System.out.print(node.data + " ");
node = node.right;
}
}
}
// 遞歸版 --> 二叉樹(後序遍歷)
public static void noRecursionPostOrder(BinaryTreeNode node) {
if (node == null) return;
noRecursionPostOrder(node.left);
noRecursionPostOrder(node.right);
System.out.print(node.data + " ");
}
// 非遞歸版 --> 二叉樹(後序遍歷)
public static void recursionPostOrder(BinaryTreeNode node) {
if (node == null) {
return;
}
Stack<BinaryTreeNode> stack1 = new Stack<>();
Stack<BinaryTreeNode> stack2 = new Stack<>();
stack1.push(node);
while (!stack1.isEmpty()) {
node = stack1.pop();
stack2.push(node);
if (node.left != null) stack1.push(node.left);
if (node.right != null) stack1.push(node.right);
}
while (!stack2.isEmpty()) {
System.out.print(stack2.pop().data + " ");
}
}
// 遞歸版 --> 深度遍歷
public static void dfs04(TreeNode node) {
if (node == null) return;
System.out.print(node.data + " ");
for (int i = 0; i < node.childNodes.size(); i++) {
dfs04(node.childNodes.get(i));
}
}
}
class BinaryTreeNode {
int data; // 數據域
BinaryTreeNode left;// 左子節點
BinaryTreeNode right; // 右子節點
public BinaryTreeNode(int data) {
this.data = data;
}
}