// 1.求二叉树中的节点个数 // 2.求二叉树的深度 // 3.前序遍历,中序遍历,后序遍历 // 4.分层遍历二叉树(按层次从上往下,从左往右) // 5.将二叉查找树变为有序的双向链表 // 6.求二叉树第K层的节点个数 // 7.求二叉树中叶子节点的个数 // 8.判断两棵二叉树是否结构相同 // 9.判断二叉树是不是平衡二叉树// 10.判断二叉树是不是完全二叉树
节点
class Node{ Node leftChild; Node rightChild; Object value; public Node(Node leftChild, Node rightChild, Object value) { this.leftChild = leftChild; this.rightChild = rightChild; this.value = value; } }
实现
//求二叉树节点个数 public static int getNodeNum(Node root){ if(root==null) return 0; return getNodeNum(root.leftChild)+getNodeNum(root.rightChild)+1; } //求二叉树的深度 public static int getDepth(Node root){ if(root==null) return 0; int leftDepth = getDepth(root.leftChild); int rightDepth = getDepth(root.rightChild); return leftDepth>=rightDepth?leftDepth+1:rightDepth+1; } //前序遍历,中续遍历,后续遍历 public static void preOrderTraversal(Node root){ if(root==null) return; System.out.print(root.value); preOrderTraversal(root.leftChild); preOrderTraversal(root.rightChild); } public static void inOrderTraversal(Node root){ if(root==null) return; inOrderTraversal(root.leftChild); System.out.print(root.value); inOrderTraversal(root.rightChild); } public static void postOrderTraversal(Node root){ if(root==null) return; postOrderTraversal(root.leftChild); postOrderTraversal(root.rightChild); System.out.print(root.value); } //分层遍历二叉树(按层次从上往下,从左往右) public static void levelTraversal(Node root){ if(root==null) return; LinkedList<Node> ll = new LinkedList<Node>(); ll.offer(root); while(!ll.isEmpty()){ root=ll.poll(); System.out.println(root.value); if(root.leftChild!=null) ll.offer(root.leftChild); if(root.rightChild!=null) ll.offer(root.rightChild); } } //二叉查找树变为有序的双向链表 static LinkedList<Node> ll=new LinkedList<Node>(); public static LinkedList<Node> binarySearchTreetoDoubleEndList(Node node){ if(node==null) return null; binarySearchTreetoDoubleEndList(node.leftChild); ll.offer(node); binarySearchTreetoDoubleEndList(node.rightChild); return ll; } //求二叉树第K层的节点个数 public static int getNodeNumkthLevel(Node root,int k){ if(root==null) return 0; if(root.leftChild==null&&root.rightChild==null) //if(k==1) return 1; int leftNum=getNodeNumkthLevel(root.leftChild,k-1); int rightNum=getNodeNumkthLevel(root.rightChild,k-1); return leftNum+rightNum; } //求二叉树中叶子节点的个数 public static int getleafNodeNum(Node root){ if(root==null) return 0; if(root.leftChild==null&&root.rightChild==null) return 1; int leftNum=getleafNodeNum(root.leftChild); int rightNum=getleafNodeNum(root.rightChild); return leftNum+rightNum; } //判断两棵二叉树是否结构相同 public static boolean isSameTree(Node n1,Node n2){ if(n1==null&&n2==null) return true; if(n1==null||n2==null) return false; boolean l = isSameTree(n1.leftChild,n2.leftChild); boolean r = isSameTree(n1.rightChild,n2.rightChild); return l&&r; } //判断二叉树是不是平衡二叉树 public static boolean isBalanceTree(Node root){ if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))>1) return false; if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))<1) return true; boolean l = isBalanceTree(root.leftChild); boolean r = isBalanceTree(root.rightChild); return l&&r; } //判断二叉树是不是完全二叉树 public static boolean isCompleteTree(Node root){ if(root.leftChild==null&&root.rightChild==null) return true; if(root.leftChild==null||root.rightChild==null) return false; boolean l = isCompleteTree(root.leftChild); boolean r = isCompleteTree(root.rightChild); return l&&r; }
时间: 2024-10-10 13:53:09