Java 二叉树一些基本操作
求二叉树中节点个数:
/*1. 求二叉树中的节点个数 递归解法: (1)如果二叉树为空,节点个数为0 (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1 */ public int GetNodeNum(TreeNode root){ if(root == null) return 0; return GetNodeNum(root.getLeft()) + GetNodeNum(root.getRight()) + 1; }
求二叉树的深度:
/*2. 求二叉树的深度 递归解法: (1)如果二叉树为空,二叉树的深度为0 (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1 */ public int GetDepth(TreeNode root){ if(root == null) return 0; int left = GetDepth(root.getLeft()); int right = GetDepth(root.getRight()); return Math.max(left, right) + 1; }
二叉树广度遍历:
public void LevelTraverse(TreeNode root){ //AbstractQueue queue = new AbstractQueue(); Queue queue = new Queue(); if(root == null) return; queue.Enqueue(root); while(queue.size != 0){ TreeNode Node = queue.Dequeue(); System.out.println(Node.getValue()); if(Node.getLeft() != null){ queue.Enqueue(Node.getLeft()); } if(Node.getRight() != null){ queue.Enqueue(Node.getRight()); } } }
判断一个二叉树是不是满二叉树:
/* * 判断一个二叉树是不是满二叉树 */ public boolean IsFullTree(TreeNode root){ boolean flag = false; Queue queue = new Queue(); if(root == null) return true; queue.Enqueue(root); while(queue.size != 0){ TreeNode node = queue.Dequeue(); if(flag == true){//flag = true表示已有节点左右子树为null if(node.getLeft() != null ||node.getRight() != null){ return false; } break; } else{ //节点左右子树不为空,则左右节点入队 if(node.getLeft() != null && node.getRight()!=null){ queue.Enqueue(node.getLeft()); queue.Enqueue(node.getRight()); } //节点右子树为空,左节点入队 else if(node.getLeft() != null && node.getRight() == null){ flag = true; queue.Enqueue(node.getLeft()); }//左节点为空,右子树不为空,直接返回FALSE else if(node.getLeft() == null && node.getRight() != null){ return false; } else {//左右都为空,则为叶子节点 flag = true; } } } return true; }
判断二叉树B是不是A的子结构:
/* * 判断树root2是不是树root1的子结构 */ public boolean SubTree(TreeNode root1,TreeNode root2){ boolean result = false; if(root1 != null && root2 != null){ if(root1.getValue() == root2.getValue()){ result = Dostree(root1,root2); } if(!result){ result = SubTree(root1.getLeft(),root2); } if(!result){ result = SubTree(root1.getRight(),root2); } } return result; } public boolean Dostree(TreeNode root1,TreeNode root2){ if(root1 == null) return false; if(root2 == null) return false; if(root1.getValue() != root2.getValue()) return false; return Dostree(root1.getLeft(),root2.getLeft()) && Dostree(root1.getRight(),root2.getRight()); }