二叉树-删除节点
要求
- 如果删除的节点是叶子节点,则删除该节点
- 如果删除的节点是非叶子节点,则删除该子树.
- 测试,删除掉 5 号叶子节点 和 3 号子树.
- 完成删除思路分析
代码实现
package com.iflytek.tree;
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;}@Overridepublic 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) {System.out.println("进入前序遍历");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;}System.out.println("进入中序查找");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;}System.out.println("进入后序查找");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.left.no == no) {this.right = null;return;}if (this.left != null) {this.left.delNode(no);}if (this.right != null) {this.right.delNode(no);}}}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("二叉树为空,无法遍历");}}public void infixOrder() {if (this.root != null) {this.root.infixOrder();} else {System.out.println("二叉树为空,无法遍历");}}public void postOrder() {if (this.root != null) {this.root.postOrder();} else {System.out.println("二叉树为空,无法遍历");}}public HeroNode preOrderSearch(int no) {if (this.root != null) {return this.root.preOrderSearch(no);} else {return null;}}public HeroNode infixOrderSearch(int no) {if (this.root != null) {return this.root.infixOrderSearch(no);} else {return null;}}public HeroNode postOrderSearch(int no) {if (this.root != null) {return this.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 class BinaryTreeDemo {public static void main(String[] args) {BinaryTree binaryTree = new BinaryTree();HeroNode root = new HeroNode(1, "宋江");HeroNode node2 = new HeroNode(2, "吴用");HeroNode node3 = new HeroNode(3, "卢俊义");HeroNode node4 = new HeroNode(4, "林冲");HeroNode node5 = new HeroNode(5, "关胜");root.setLeft(node2);root.setRight(node3);node3.setRight(node4);node3.setLeft(node5);binaryTree.setRoot(root);System.out.println("删除前,前序遍历");binaryTree.preOrder(); binaryTree.delNode(5);System.out.println("删除后,前序遍历");binaryTree.preOrder(); }
}
思考题(课后练习)
- 如果要删除的节点是非叶子节点,现在我们不希望将该非叶子节点为根节点的子树删除,需要指定规则, 假如 规定如下:
- 如果该非叶子节点A只有一个子节点 B,则子节点 B替代节点A
- 如果该非叶子节点A有左子节点 B 和右子节点 C,则让左子节点 B 替代节点A。
- 请大家思考,如何完成该删除功能, (课后练习)
- 后面在讲解 二叉排序树时,在给大家讲解具体的删除方法