问题描述
传入树的根结点,判断当前树是否是满二叉树。
定义树结点的实体类
public class TreeNode {
private TreeNode leftTreeNode;//左子树
private TreeNode rightTreeNode;//右子树
private Object data;//数据域
public TreeNode(){}
public TreeNode(Object data){
this.data = data;
}
public TreeNode getLeftTreeNode() {
return leftTreeNode;
}
public void setLeftTreeNode(TreeNode leftTreeNode) {
this.leftTreeNode = leftTreeNode;
}
public TreeNode getRightTreeNode() {
return rightTreeNode;
}
public void setRightTreeNode(TreeNode rightTreeNode) {
this.rightTreeNode = rightTreeNode;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
判断一棵树是否是满二叉树
/**
*
* @author chenlang
* 判断一棵树是否是满二叉树
* 思路一:
* 递归解决,对于每一个结点来说, 由左子树求得的高度与由右子树求得的高度相等,
* 当满足该条件时,当前树为满二叉树。
* 步骤:
* 1. 根节点由左子树求得的高度等于由右子树求得的高度。
* 2. 根节点的左子结点由左子树求得的高度等于由右子树求得的高度,根节点的右子结点由左子树求得的高度等于由右子树求得的高度。
* 3. 依次处理树中的每个结点。
*
* (结点的高度:结点到叶子结点的最长路径(边数))
*
*/
public class FullBinTree {
/*
* 由treeNode获取 treeNode父结点的高度,叶子结点的高度为0。
* 某个结点treeNode的左子结点为null, 则由左子结点求得treeNode的高度为0
* 某个结点treeNode的右子结点为null, 则由右子结点求得treeNode的高度为0
*/
public static int getTreeNodeHeight(TreeNode treeNode){
// treeNode为null,则由treeNode求得的父结点高度为0
if(treeNode==null){
return 0;
}
//由左子树求当前结点treeNode的高度
int leftHeight = getTreeNodeHeight(treeNode.getLeftTreeNode());
//由右子树求当前结点treeNode的高度
int rightHeight = getTreeNodeHeight(treeNode.getRightTreeNode());
//当前结点的高度+1 为 父结点的高度
int height = leftHeight >= rightHeight ? leftHeight+1 : rightHeight+1;
return height;
}
/*
* 判断一棵树是否为满二叉树
*/
public static boolean isFullBinTree(TreeNode root){
if(root==null){
return false;
}
//结点的左右子树均为null,则当前结点是满二叉树。
if(root.getLeftTreeNode()==null && root.getRightTreeNode()==null){
return true;
}
//由根结点的左子结点求根结点的高度
int leftHeight = getTreeNodeHeight(root.getLeftTreeNode());
//由根结点的右子结点求根结点的高度
int rightHeight = getTreeNodeHeight(root.getRightTreeNode());
if(leftHeight!=rightHeight){
return false;
}
//根结点的左右子结点得进行相同的处理
if(isFullBinTree(root.getLeftTreeNode()) && isFullBinTree(root.getRightTreeNode())){
return true;
}
return false;
}
}