文章目录

  • 一、二叉树前中后遍历
  • 二、获取节点个数
  • 三.获取叶子节点个数
  • 四.获取第k层节点个数
  • 五.求二叉树的高度,时间复杂度O(N)
  • 六.检测值为value的元素是否存在
  • 七. 检查两颗树是否相同
  • 八.判断一棵二叉树是不是平衡二叉树
  • 九.一个二叉树的根节点 root , 检查它是否轴对称
  • 十. 判断subRoot是不是root的子树
  • 十一.翻转二叉树
  • 总结

一、二叉树前中后遍历

public class BinaryTree {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode creatTree(){TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;C.left = F;C.right = G;E.right = H;return A;}//前序遍历void preOrder(TreeNode root){//根左右if(root == null){return;}System.out.print(root.val+" ");preOrder(root.left);preOrder(root.right);}//中序遍历void inOrder(TreeNode root){//左根右if(root == null){return;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}//后序遍历void postOrder(TreeNode root){//左右根if(root == null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}public static void main(String[] args) {BinaryTree binaryTree = new BinaryTree();BinaryTree.TreeNode root = binaryTree.creatTree();binaryTree.preOrder(root);System.out.println();binaryTree.inOrder(root);System.out.println();binaryTree.postOrder(root);}}

二、获取节点个数

public int nodeSize;int size(TreeNode root){if (root == null){return 0;}nodeSize++;size(root.left);size(root.right);return nodeSize;}//子问题思路解决:整棵树的节点=左子树的节点+右子数的节点+1int size2(TreeNode root){if (root == null){return 0;}return size2(root.left)+size2(root.right)+1;}

三.获取叶子节点个数

public int leafSize;int getLeafNodeCount(TreeNode root){if (root == null){return 0;}if (root.left == null && root.right == null){leafSize++;}getLeafNodeCount(root.left);getLeafNodeCount(root.right);return leafSize;}

四.获取第k层节点个数

 public int leveSize;int getleveNodeCount(TreeNode root,int k){if(root == null){return 0;}if (k == 1) {return 1;}return getleveNodeCount(root.left,k-1)+ getleveNodeCount(root.right,k-1);}

五.求二叉树的高度,时间复杂度O(N)

int getHeight(TreeNode root){if (root == null){return 0;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return leftHeight > rightHeight?leftHeight+1:rightHeight+1;}

六.检测值为value的元素是否存在

TreeNode find(TreeNode root,int val){if (root == null){return null;}if (root.val == val){return root;}TreeNode ret1 = find(root.left,val);if (ret1 != null){return ret1;}TreeNode ret2 = find(root.right,val);if (ret2 != null){return ret2;}return null;}

七. 检查两颗树是否相同

public boolean isSameTree(TreeNode p, TreeNode q) { if( (p == null && q !=null) || (p != null && q == null) ){return false;}if(p == null && q == null){return true;}if(p.val !=q.val){return false;}return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}

八.判断一棵二叉树是不是平衡二叉树

时间复杂度O(N)

 public boolean isBalanced(TreeNode root) {if(root == null){return true;}return getHeight(root)>=0;} int getHeight(TreeNode root) {if (root == null){return 0;}int leftHeight =getHeight(root.left);if(leftHeight < 0){return -1;}int rightHeight = getHeight(root.right);if(leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <=1){return Math.max(leftHeight,rightHeight)+1;}else{return -1;}}

九.一个二叉树的根节点 root , 检查它是否轴对称

public boolean isSymmetric(TreeNode root) {if(root == null) return true;return isSymmetricChild(root.left,root.right);}private boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){if((leftTree == null && rightTree != null) ||(leftTree != null && rightTree == null)){return false;}if(leftTree == null && rightTree == null){return true;}if(leftTree.val != rightTree.val){return false;}return isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);}

十. 判断subRoot是不是root的子树

//时间复杂度:O(m*n)public boolean isSubtree(TreeNode root,TreeNode subTree) {if(root == null || subTree == null) {return false;}//判断根节点是否相同if (isSameTree(root,subTree)){return true;}//判断左子树是否相同if(isSubtree(root.left, subTree)) {return true;}//判断右子树是否相同if(isSubtree(root.right, subTree)) {return true;}return false;}public boolean isSameTree(TreeNode p, TreeNode q) {if( (p == null && q !=null) || (p != null && q == null) ){return false;}if(p == null && q == null){return true;}if(p.val !=q.val){return false;}return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);}

十一.翻转二叉树

public TreeNode invertTree(TreeNode root){if(root == null){return null;}if(root.left == null && root.right == null){return root;}//交换左右节点TreeNode tmp = root.left;root.left = root.right;root.right = tmp;//交换左树invertTree(root.left);//交换右树invertTree(root.right);return root;}

总结

今天复习二叉树练习。
时隔一个月继续更新文章,学校的考试周太可怕了=.= 怕挂科所以全身心投入复习,平时都学编程了,学校的课靠最后几周学完全部,也是挺厉害的哈哈。