二叉搜索树的后序遍历

二叉搜索树的后序遍历序列中,最后一个值是根结点,前面比根节点小的是左结点,后面比根结点大的是右结点。

#include <iostream>
#include <cstdlib>

bool VerifySquenceOfBST(int sequence[], int length)
{
	if (sequence == NULL || length<=0)
	{
		return false;
	}
	int root = sequence[length - 1];
	int i = 0;
	//在二查搜索树中左子树的结点小于根节点
	for (; i < length - 1;++i)
	{
		
		if (sequence[i]>root)
		{
			break;
		}
	}
	//在二查搜索树中右子树的结点大于根节点
	int j = i;
	for (; j < length - 1;++j)
	{
		if (sequence[j]<root)
		{
			return false;
		}
	}
	//判断左子树是不是二查搜索树
	bool left = true;
	if (i > 0)
	{
		left = VerifySquenceOfBST(sequence, i);
	}
	bool right = true;
	if (i<length - 1)
	{
		right = VerifySquenceOfBST(sequence + i, length - i - 1);
	}
	return (left&&right);
}
// ====================测试代码====================
void Test(char* testName, int sequence[], int length, bool expected)
{
	if (testName != NULL)
		printf("%s begins: ", testName);

	if (VerifySquenceOfBST(sequence, length) == expected)
		printf("passed.\n");
	else
		printf("failed.\n");
}

//            10
//         /      \
//        6        14
//       /\        /\
//      4  8     12  16
void Test1()
{
	int data[] = { 4, 8, 6, 12, 16, 14, 10 };
	Test("Test1", data, sizeof(data) / sizeof(int), true);
}

//           5
//          / \
//         4   7
//            /
//           6
void Test2()
{
	int data[] = { 4, 6, 7, 5 };
	Test("Test2", data, sizeof(data) / sizeof(int), true);
}

//               5
//              /
//             4
//            /
//           3
//          /
//         2
//        /
//       1
void Test3()
{
	int data[] = { 1, 2, 3, 4, 5 };
	Test("Test3", data, sizeof(data) / sizeof(int), true);
}

// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5
void Test4()
{
	int data[] = { 5, 4, 3, 2, 1 };
	Test("Test4", data, sizeof(data) / sizeof(int), true);
}

// 树中只有1个结点
void Test5()
{
	int data[] = { 5 };
	Test("Test5", data, sizeof(data) / sizeof(int), true);
}

void Test6()
{
	int data[] = { 7, 4, 6, 5 };
	Test("Test6", data, sizeof(data) / sizeof(int), false);
}

void Test7()
{
	int data[] = { 4, 6, 12, 8, 16, 14, 10 };
	Test("Test7", data, sizeof(data) / sizeof(int), false);
}

void Test8()
{
	Test("Test8", NULL, 0, false);
}

void main()
{
	Test1();
	Test2();
	Test3();
	Test4();
	Test5();
	Test6();
	Test7();
	Test8();
	system("pause");
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值