最大搜索二叉树的节点数

  • 问题描述:
    找到一棵二叉树中,最大的搜索二叉子树,返回最大搜索二叉子树的节点个数。
    需要解决的问题:

    • 判断二叉树是搜索二叉树
    • 并且返回最大搜索二叉树的节点数

什么是搜索二叉树?
搜索二叉树俗称排序二叉树,通过这个名字可以大概了解就是左孩子的数值小于双亲结点,并且满足右孩子节点的数值大于双亲节点。同时子树也满足这个特点。对应这个点也是我们解决问题的一个依据点。

返回最大搜索二叉树?
这个如果我们要一一遍历二叉树,通过某种记录方法,这样时间复杂度增加同时,还需要编写各种方法体判断搜索二叉树,以及比较节点数的方法等等
这样一来不仅增加我们解决问题的难度,同时还有可能打乱思路。换个思路,假设每一个节点都能反映出对应左右孩子的一些数据,那么我们是否可以利用这些数据进行搜索二叉树的判断呢?同时进行比较,逐层下去,最终留下的那个便是最大搜索二叉树。
思路:
1.首先要定义一个二叉树的结构。
2.再定义一个结构体编写返回判断搜索二叉树所需要的数据
3.进行方法体的编写
4.利用递归思想逐级比较

具体实现代码:

//   1
public static class Node {
		public int value;
		public Node right;
		public Node left;

		public Node(int res) {
			value = res;

		}
	}
//      3
	public static Node getMaxTree(Node head) {
		return process(head).maxBSTHead;
	}
    //    2
	public static class Type {
		public Node maxBSTHead;
		public int maxBSTSize;
		public int min;
		public int max;

		public Type(Node maxBSTHead, int maxBSTSize, int min, int max) {
			this.maxBSTHead = maxBSTHead;
			this.maxBSTSize = maxBSTSize;
			this.min = min;
			this.max = max;
		}
	}
      //         4
	public static Type process(Node head) {
		if (head == null)
			return new Type(null, 0, Integer.MAX_VALUE, Integer.MIN_VALUE);

		Type leftNode = process(head.left);
		Type rightNode = process(head.right);

		int min = Math.min(head.value, Math.min(leftNode.min, rightNode.min));
		int max = Math.max(head.value, Math.max(leftNode.max, rightNode.max));

		int maxBSTSize = Math.max(rightNode.maxBSTSize, leftNode.maxBSTSize);
		
		Node maxBSThead = leftNode.maxBSTSize > rightNode.maxBSTSize ? leftNode.maxBSTHead : rightNode.maxBSTHead;

		if (leftNode.maxBSTHead == head.left && rightNode.maxBSTHead == head.right
				&& leftNode.maxBSTHead.value < head.value && head.value < rightNode.maxBSTHead.value) {
              maxBSThead=head;
              maxBSTSize=leftNode.maxBSTSize+1+rightNode.maxBSTSize;
		}
		return new Type(maxBSThead, maxBSTSize, min, max);
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值