首先,定义结点类 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val){ this.val=val; this.left=null; this.right=null; } }
接下来,我们定义二叉树,实现各种方法
import java.util.LinkedList; import java.util.Queue; public class BinaryTree { public TreeNode root; public BinaryTree(){ root=null; } //二叉树的插入,比该元素小则插入该结点左子树,大则插入右子树 public void insert(int val){ root=insert(root,val); } public TreeNode insert(TreeNode node,int val){ if(node==null){ node=new TreeNode(val); } else { if (val<=node.val){ node.left=insert(node.left,val); }else { node.right=insert(node.right,val); } } return node; } //根据值查找结点,有则返回true,没有则返回false public boolean search(int val){ return search(root,val); } public boolean search(TreeNode node,int val){ if (node==null){ return false; }else if (node.val==val){ return true; }else if (val<node.val){ return search(node.left,val); }else { return search(node.right,val); } } //删除结点 public void delete(int val){ root=delete(root,val); } public TreeNode delete(TreeNode node,int val){ if (node==null){ return null; }else if (val<node.val){ node.left=delete(node.left,val); }else if (val> node.val){ node.right=delete(node.right,val); }else { //已经找到结点 //1:要删除的结点为子节点 if (node.right==null && node.left==null ){ node=null; } //2:要删除的结点只有右结点 else if (node.left==null){ node=node.right; } //3:要删除的结点只有左结点 else if (node.right==null){ node=node.left; } //4:要删除的结点有左右结点 else { //找到该结点右子树的最小结点 TreeNode temp=findMin(node.right); node.val=temp.val; node.right=delete(node.right,temp.val); } } return node; } public TreeNode findMin(TreeNode node){ while (node.left!=null){ node=node.left; } return node; } //中序遍历 public void inorderTraversal(){ inorderTraversal(root); } public void inorderTraversal(TreeNode node){ if (node!=null){ inorderTraversal(node.left); System.out.print(node.val+" "); inorderTraversal(node.right); } } //前序遍历 public void proOrderTraversal(){ proOrderTraversal(root); } public void proOrderTraversal(TreeNode node){ if (node!=null){ System.out.print(node.val+" "); inorderTraversal(node.left); inorderTraversal(node.right); } } //后序遍历 public void postOrderTraversal(){ proOrderTraversal(root); } public void postOrderTraversal(TreeNode node){ if (node!=null){ inorderTraversal(node.left); inorderTraversal(node.right); System.out.print(node.val+" "); } } //层序遍历 public void levelOrderTraversal(){ if (root==null){ return; } Queue<TreeNode> queue=new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()){ TreeNode node=queue.poll(); System.out.print(node.val+" "); if (node.left!=null){ queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } } }
//查找双亲结点 public TreeNode getParent(TreeNode node){ return findParent(root,node); } public TreeNode findParent(TreeNode root,TreeNode node){ if (root==null || root==node){ return null; } if (root.left==node || root.right==node){ return root; } TreeNode parent=findParent(root.left,node); if (parent!=null){ return parent; } return findParent(root.right,node); } //查找兄弟结点 public TreeNode getSibling(TreeNode node){ TreeNode parent=getParent(node); if (parent==null){ return null; } if (parent.left==node){ return parent.right; }else { return parent.left; } } //查找孩子结点 public TreeNode[] getChildren(TreeNode node){ TreeNode[] children=new TreeNode[2]; children[0]=node.left; children[1]=node.right; return children; } }