判断的后序遍历序列是否是二叉查找树

二叉查找树:如果左子树不为空,那么左子树上的所有节点都小于根节点;

      如果右子树不为空,那么又子树上的所有节点都大于根节点;

      左右子树也是二叉排序树。

在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:
  • (1)第一部分是左子树结点的值,它们都比根结点的值小
  • (2)第二部分是右子树结点的值,它们都比根结点的值大
  • (3)递归左子树
  • (4)递归右子树

 

代码:

  public class BinarySearchTrees
    {
        //有序遍历结果的特点是,最后一个元素是根元素,根据这个根元素会把其他的子序列按照大小分成两个部分,
        //最后递归地对这两个子序列分别进行上述操作

        public static bool VerifyBST()
        {
            int[] array = { 5,7,6,9,11,10,8};
          return  VerifyBST(array, 0, array.Length-1);
        }

        public static bool VerifyBST(int[] array, int start, int end)
        {
            if (start == end)
                return true;
            int root = array[end];

            //遍历左子树
            int left = start;
            while (left < end && array[left] < root) { left++; }
            left--;

            //遍历右子树
            int right = left+1;
            while (right < end && array[right] > root)
            {
                if (array[right] < root) //右子树如果有小于根节点的,直接返回
                    return false;
                right++;
            }

            //递归左子树
            bool leftRecurse = true;
            if (left - start > 0)
            {
                leftRecurse = VerifyBST(array, start, left);
            }

            //递归右子树
            bool rightRecurse = true;
            if (end - left > 0)
            {
                rightRecurse = VerifyBST(array, left, end);
            }

            return leftRecurse&&rightRecurse;
        }
    }

  

posted on 2013-10-21 09:34  豆沙包没有肉  阅读(258)  评论(0编辑  收藏  举报

导航