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;
}
}
}