面试题24 数组是不是二叉搜索树的后序优先遍历

分析:在后序遍历得到的序列中,最后一个数字是树的根结点的值,数组中前面的数字可分为两个部分:第一部分是左子树结点的值,它们都比根结点的值小,第二部分是右子树结点的值,它们都比根结点的值大。

代码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. bool VerifySequenceOfBST(int nSequence[], int nLength)  
  6. {  
  7.     if (nSequence == NULL || nLength <= 0)  
  8.     {  
  9.         return false;  
  10.     }  
  11.   
  12.     int nRoot = nSequence[nLength - 1];  
  13.     int nIndex = 0;  
  14.     while (nSequence[nIndex] < nRoot)//左子树中结点的值小于根节点的值  
  15.     {  
  16.         nIndex++;  
  17.     }  
  18.   
  19.     for (int i=nIndex+1; i<nLength; i++)//右子树中结点的值大于根节点的值  
  20.     {  
  21.         if (nSequence[i] < nRoot)  
  22.         {  
  23.             return false;  
  24.         }  
  25.     }  
  26.   
  27.     bool bLeft = true;  
  28.     if (nIndex > 0)  
  29.     {  
  30.         bLeft = VerifySequenceOfBST(nSequence, nIndex);  
  31.     }  
  32.   
  33.     bool bRight = true;  
  34.     if ((nIndex + 1) < nLength)  
  35.     {  
  36.         bRight = VerifySequenceOfBST(nSequence+nIndex, nLength - 1 - nIndex);  
  37.     }  
  38.   
  39.     return  (bLeft && bRight);    
  40. }  
  41.   
  42. int _tmain(int argc, _TCHAR* argv[])  
  43. {  
  44.     int nArr1[7] = {5, 7, 6, 9, 11, 10, 8};//正确序列,有左右子树  
  45.     cout << VerifySequenceOfBST(nArr1, 7) << endl;  
  46.     int nArr2[4] = {7, 4, 6, 5};//错误序列  
  47.     cout << VerifySequenceOfBST(nArr2, 4) << endl;  
  48.     int nArr3[3] = {3, 2, 1};//右单支  
  49.     cout << VerifySequenceOfBST(nArr3, 3) << endl;  
  50.     int nArr4[3] = {1, 2, 3};//左单支  
  51.     cout << VerifySequenceOfBST(nArr4, 3) << endl;  
  52.     int nArr5[1] = {1};//单个结点  
  53.     cout << VerifySequenceOfBST(nArr5, 1) << endl;  
  54.     system("pause");  
  55.     return 0;  
  56. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值