前序遍历:根节点,左子树,右子树
中序遍历:左子树,根节点,右子树
后序遍历:左子树,右子树,根节点
二叉树的遍历规则:在前中后序遍历中先左子树,后右子树的规则不变,变的只有根节点的顺序
public class BinaryTreeDemo { public static void main(String[] args) { BinaryTree binaryTree = new BinaryTree(); HeroNode root = new HeroNode(1, "宋江"); HeroNode root2 = new HeroNode(2, "吴用"); HeroNode root3 = new HeroNode(3, "卢俊义"); HeroNode root4 = new HeroNode(4, "林冲"); HeroNode root5 = new HeroNode(5, "关胜"); //手动创树 root.setLeft(root2); root.setRight(root3); root3.setRight(root4); root3.setLeft(root5); binaryTree.setRoot(root); System.out.println("前"); binaryTree.preOrder(); System.out.println("中"); binaryTree.infixOrder(); System.out.println("后"); binaryTree.postOrder(); HeroNode node = binaryTree.preOrderSearch(5); HeroNode node2 = binaryTree.infixOrderSearch(5); HeroNode node3 = binaryTree.postOrderSearch(5); System.out.println(node3); binaryTree.delNode(3);//附带后面删除 binaryTree.del(3);//只删除本身 System.out.println(); binaryTree.preOrder(); } } //定义二叉树 class BinaryTree { private HeroNode root; public void setRoot(HeroNode root) { this.root = root; } //前 public void preOrder() { if (this.root != null) { this.root.preOrder(); } else { System.out.println("null"); } } //中 public void infixOrder() { if (this.root != null) { this.root.infixOrder(); } else { System.out.println("null"); } } //后 public void postOrder() { if (this.root != null) { this.root.postOrder(); } else { System.out.println("null"); } } //查找 public HeroNode preOrderSearch(int no) { if (root != null) { return root.preOrderSearch(no); } else { return null; } } public HeroNode infixOrderSearch(int no) { if (root != null) { return root.infixOrderSearch(no); } else { return null; } } public HeroNode postOrderSearch(int no) { if (root != null) { return root.postOrderSearch(no); } else { return null; } } //删除 public void delNode(int no) { if (root != null) { if (root.getNo() == no) { root = null; } else { root.delNode(no); } } else { System.out.println("空树"); } } public void del(int no) { if (root != null) { if (root.getNo() == no) { root = null; } else { root.del(no); } } else { System.out.println("空树"); } } } class HeroNode { private int no; private String name; private HeroNode left; private HeroNode right; public HeroNode(int no, String name) { this.no = no; this.name = name; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public HeroNode getLeft() { return left; } public void setLeft(HeroNode left) { this.left = left; } public HeroNode getRight() { return right; } public void setRight(HeroNode right) { this.right = right; } @Override public String toString() { return "HeroNode[" + "no=" + no + ", name=‘" + name + ‘\‘‘ + ‘]‘; } /* 是什么遍历看什么时候输出父节点 */ //前序遍历 public void preOrder() { System.out.println(this); if (this.left != null) { this.left.preOrder(); } if (this.right != null) { this.right.preOrder(); } } //中序遍历 public void infixOrder() { if (this.left != null) { this.left.infixOrder(); } System.out.println(this); if (this.right != null) { this.right.infixOrder(); } } //后续遍历 public void postOrder() { if (this.left != null) { this.left.postOrder(); } if (this.right != null) { this.right.postOrder(); } System.out.println(this); } //前序查找 public HeroNode preOrderSearch(int no) { if (this.no == no) { return this; } HeroNode resNode = null; if (this.left != null) { resNode = this.left.preOrderSearch(no); } if (resNode != null) { return resNode; } if (this.right != null) { resNode = this.right.preOrderSearch(no); } return resNode; } //中序查找 public HeroNode infixOrderSearch(int no) { HeroNode resNode = null; if (this.left != null) { resNode = this.left.infixOrderSearch(no); } if (resNode != null) { return resNode; } if (this.no == no) { return this; } if (this.right != null) { resNode = this.right.infixOrderSearch(no); } return resNode; } //后序查找 public HeroNode postOrderSearch(int no) { HeroNode resNode = null; if (this.left != null) { resNode = this.left.postOrderSearch(no); } if (resNode != null) { return resNode; } if (this.right != null) { resNode = this.right.postOrderSearch(no); } if (resNode != null) { return resNode; } if (this.no == no) { return this; } return resNode; } public void delNode(int no) { if (this.left != null && this.left.no == no) { this.left = null; return; } if (this.right != null && this.right.no == no) { this.right = null; return; } if (this.left != null) { this.left.delNode(no); } if (this.right != null) { this.right.delNode(no); } } public void del(int no) { if (this.left != null && this.left.no == no) { this.left = null; return; } if (this.right != null && this.right.no == no) { if (this.right.left != null && this.right.right != null) { this.right.left.right = this.right.right; this.right = this.right.left; return; } else { this.right = null; return; } } if (this.left != null) { this.left.delNode(no); } if (this.right != null) { this.right.delNode(no); } } }
原文:https://www.cnblogs.com/bingbug/p/12286738.html