树
二叉树
构建二叉树
int value;Node left;Node right;public Node(int val) {value=val;}
节点的添加
Node root=null;public void insert(int num) {Node node=new Node(num);if(root==null) {root=node;return;}Node index = root;while(true) {//插入的节点值小if(index.value>num) {if(index.left==null) {//插入index.left=node;return;}else {index =index.left;}}else {//插入的节点值大if(index.right==null) {index.right=node;return;}else {index=index.right;}}}}
遍历
public void levelQrder() {Queue<Node> queue=new LinkedList<Node>();if(root!=null)queue.add(root);Node index=null;while(!queue.isEmpty()) {index =queue.poll();System.out.print(index.value+"");if(index.left!=null) {queue.add(index.left);}if(index.right!=null) {queue.add(index.right);}}System.out.println();}
查找
查找某个节点
public Node search(int num) {Node index=root;while(index!=null&&index.value!=num) {if(index.value>num) {//目标值小index=index.left;}else {index=index.right;}}return index;}
查找某个节点的父节点
public Node searchParent(int num) {Node index=root;while (index!=null) {if((index.left!=null&&index.left.value==num)||
(index.right!=null&&index.right.value==num)){return index;}else if(index.value>num) {index=index.left;}else {index = index.right;}}return null;}
查找一棵树中最小的节点
public int min(Node treeNode) {Node index = treeNode;while(index.left!=null){index=index.left;}return index.value;}
删除
删除可分为三种情况,即删除叶子节点、删除只有一棵子树的节点、删除有两棵子树的节点
删除叶子节点
1、找到要删除的节点target
if(root==null) {System.out.println("空树");return;}//找目标节点Node target = search(num);//没有目标节点if(target==null) {System.out.println("没有这个节点");return;}
2、找要删除节点的父节点parent
3、考虑有没有父节点
如果没有父节点,那target为根节点root=null
if(parent==null) {root=null;return;}
4、如果有父节点
讨论parenti和target的关系
target是父节点的左孩子 parent.left=null
target是父节点的右孩子 parent.right=null
删除只有一棵子树的节点
1、找到要删除的节点target
2、找要删除节点的父节点parent
3、考虑有没有父节点
如果没有父节点,那target为根节点
判断target有左子树还是右子树?
如果目标节点有左子树 root=root.left
如果目标节点有右子树 root=root.right
4、如果目标节点有父节点
判断目标节点是父节点的左孩子还是右孩子?
(1)目标节点是父节点的左孩子
判断target有左子树还是右子树?
目标节点有左子树
parent.left =target.left
目标节点有子树
parent.left =target.left
(2)目标节点是父节点的右孩子
判断targe有左子还是右子树?
目标节点有左子树
parent.right =target.left
目标节点有子树
parent.left =target.right
删除有两棵子树的节点
1、找目标节点右子树的最小值(左子树的最大值)替换掉要删除的值
2、把目标节点右子树的最小值(左子树的最大值)删除
int minValue = min(target.right);delete(minValue);target.value=minValue;