找到二叉树中的最大搜索二叉树,左程云《程序员代码面试指南》

 

void Test()
{
	BinaryTreeNode* pNode1 = CreateBinaryTreeNode(6);
	BinaryTreeNode* pNode2 = CreateBinaryTreeNode(1);
	BinaryTreeNode* pNode3 = CreateBinaryTreeNode(12);
	BinaryTreeNode* pNode4 = CreateBinaryTreeNode(0);
	BinaryTreeNode* pNode5 = CreateBinaryTreeNode(3);
	BinaryTreeNode* pNode6 = CreateBinaryTreeNode(10);
	BinaryTreeNode* pNode7 = CreateBinaryTreeNode(13);
	BinaryTreeNode* pNode8 = CreateBinaryTreeNode(4);
	BinaryTreeNode* pNode9 = CreateBinaryTreeNode(14);
	BinaryTreeNode* pNode10 = CreateBinaryTreeNode(20);
	BinaryTreeNode* pNode11 = CreateBinaryTreeNode(16);
	BinaryTreeNode* pNode12 = CreateBinaryTreeNode(2);
	BinaryTreeNode* pNode13 = CreateBinaryTreeNode(5);
	BinaryTreeNode* pNode14 = CreateBinaryTreeNode(11);
	BinaryTreeNode* pNode15 = CreateBinaryTreeNode(15);

	ConnectTreeNodes(pNode1, pNode2, pNode3);
	ConnectTreeNodes(pNode2, pNode4, pNode5);
	ConnectTreeNodes(pNode3, pNode6, pNode7);
	ConnectTreeNodes(pNode6, pNode8, pNode9);
	ConnectTreeNodes(pNode7, pNode10, pNode11);
	ConnectTreeNodes(pNode8, pNode12, pNode13);
	ConnectTreeNodes(pNode9, pNode14, pNode15);

	BinaryTreeNode *p = biggest(pNode1);
	PrintTree(p);
	DestroyTree(pNode1);
}

BinaryTreeNode* biggest(BinaryTreeNode *root)
{
	int size = 0;
	int min=0;
	int max=0;
	return posOrder(root,size,min,max);
}

BinaryTreeNode *posOrder(BinaryTreeNode *root, int &size, int &min, int &max)
{
	if (root == NULL)
	{
		//叶子节点百搭
		size = 0;
		min = numeric_limits<int>::max();
		max = numeric_limits<int>::min();
		return NULL;
	}
	else
	{
		int value = root->m_nValue;	
		int lsize, lmin, lmax;
		BinaryTreeNode *lp = posOrder(root->m_pLeft,lsize,lmin,lmax);

		int rsize, rmin, rmax;
		BinaryTreeNode *rp = posOrder(root->m_pRight, rsize, rmin, rmax);
	
		if (lp==root->m_pLeft && rp==root->m_pRight && lmax<value && rmin>value)
		{
			size = 1 + lsize + rsize;
            //要考虑左、右子树为空的情况 
			min = lmax == numeric_limits<int>::max()?value:lmin;
			max = rmax == numeric_limits<int>::min() ? value : rmax;
			return root;	
		}
		else
		{
			size = getmax(lsize, rsize);
			min = lsize > rsize ? lmin : rmin;
			max = lsize > rsize ? lmax : rmax;
			return lsize > rsize ? lp : rp;
		}
	}
}


 

转载于:https://my.oschina.net/u/1267048/blog/1538442

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值