二叉树递归判断满二叉树

二叉树递归判断一颗二叉树是不是满二叉树

题目:判断一颗二叉树是不是满二叉树

*分析:所谓满二叉树,无非就是满足在该树中任意一层的节点都是满的。例 如:高度为h的二叉树它的满二叉树的所有节点n满足这样一个公式 2^h-1 = n。但是注意这里的高度h是从0层开始的。也就是根节点是0层。
所以此时我们只需得到总节点和高度即可。我采用递归的方法来写。

//判断一棵树是不是满二叉树
//满二叉树:2^h-1 = n  h为高度。n为总节点数
public class FullTree {
	//二叉树结点的定义
	static class Node {
		public int value;
		public Node leftChild;
		public Node rightChild;

		public Node(int data, Node lc, Node rc) {
			value = data;
			leftChild = lc;
			rightChild = rc;
		}
	}
	//我所需要的信息
	public static class Info {
		public int height;//高度
		public int nodes;//总节点数
		
		public Info(int h,int n) {
			height = h;
			nodes = n;
		}
	}
	//主函数
	public static void main(String[] args) {
//		Node node7 = new Node(7,null,null);
//		Node node8 = new Node(8,null,null);
//		Node node9 = new Node(9,null,null);
//		Node node10 = new Node(10,null,null);
//		Node node11 = new Node(11,null,null);
//		Node node12 = new Node(12,null,null);
//		Node node6 = new Node(6,node11,node12);
//		Node node5 = new Node(5,node9,node10);
//		Node node4 = new Node(4,node7,node8);
//		Node node3 = new Node(3,null,null);
//		Node node2 = new Node(2,null,null);
		Node node1 = new Node(1,null,null);
		System.out.println(isFullTree(node1));
	}
	
	
	public static boolean isFullTree(Node X) {
		if(X == null) return true;
		
		Info all = process(X);//获得整棵树的高度和总节点数
		//((1 << all.height)-1) 举个例子:假如all.height=4 表示00001(1) 在二进制情况下向左移4位转换成十进制就是2^4
		return all.nodes == ((1 << all.height)-1);
	}

	//递归套路方法
	public static Info process(Node X) {
		if(X == null) return new Info(0,0);
		
		//假设左树可以给我信息
		Info leftInfo = process(X.leftChild);
		
		//假设右树可以给我信息
		Info rightInfo = process(X.rightChild);
		//高度
		int height = Math.max(leftInfo.height, rightInfo.height) + 1;
		//总节点数
		int nodes = leftInfo.nodes +rightInfo.nodes + 1;
		return new Info(height,nodes);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值