编写判断给定二叉树是否为二叉排序树的函数
2011-09-17 13:47
351 查看
#include "stdafx.h" #include <iostream> #include <algorithm> using namespace std; struct Node { int element; Node *left; Node *right; Node(int ele = 0, Node *l = NULL, Node *r = NULL) :element(ele), left(l), right(r){} }; //插入结点 void InsertNode(Node *&root, int element) { if (NULL == root) root = new Node(element); else if (element < root->element) InsertNode(root->left, element); else InsertNode(root->right, element); } //创建二叉搜索树 void CreateBinSearchTree(Node *&root, int arr[], int n) { for (int i = 0; i < n; ++i) InsertNode(root, arr[i]); } //中序输出 void MiddlePrint(Node *root) { if (NULL != root) { MiddlePrint(root->left); cout<<root->element<<" "; MiddlePrint(root->right); } } //函数功能:二叉排序树的判定算法 /* 算法思想:根据二叉树的特点“其中序遍历序列为有序序列”,对二叉树进行中序遍历, 同时检查当前结点与其中前驱关键字值的大小。 */ //中序遍历过程中判定给定的二叉树是否为二叉排序树,入是返会true,否则返回false //pre指向中序前驱结点,初值为NULL bool IsBinSearchTree(Node *root, Node *pre) { if(NULL == root) //空二叉树也是二叉排序树 return true; //左子树为二叉排序树且关键字值大于前驱结点关键字值, //此时,是否为二叉树却决于右子树 if (IsBinSearchTree(root->left, pre)) { if ( (NULL == pre) || (pre->element < root->element)) { pre = root; return IsBinSearchTree(root->right, pre); } } else return false; } int main() { const int N = 10; int arr ; for (int i = 0; i < N; i++) arr[i] = i + 1; random_shuffle(arr, arr + N); Node *root = NULL; CreateBinSearchTree(root, arr, N); MiddlePrint(root); cout<<endl; Node *pre = NULL; if (IsBinSearchTree(root, pre)) cout<<"是二叉排序树!"<<endl; }
相关文章推荐
- 判断给定的二叉树是否为二叉排序树
- 判断给定的二叉树是否为二叉排序树
- 判断给定的二叉树是否为二叉排序树
- 设计一个算法,判断给定的一棵二叉树是否是二叉排序树(二叉树的所有关键字均为正整数)
- 编写一个判断二叉树是否为完全二叉树的C语言函数
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
- 编写程序,判断给定的某个年份是否是闰年。
- 判断给定数组是否是二叉树的前序或者后序遍历结果
- 给定两个二叉树T和S,判断S是否为T的子树
- 判断二叉树是否二叉排序树(BST)
- 编写正则表达式,判断给定的是否是一个合法的IP地址。
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
- 【面试】判断一棵二叉树是否为二叉排序树
- 判断一棵二叉树是否是二叉排序树
- 判断二叉树是否为二叉排序树
- 判断二叉树是否为二叉排序树
- 给定二叉树的前序和中序,判断是否可以构成一颗二叉树,如果可以输出后序
- 编写正则表达式,判断给定的是否是一个合法的IP地址。
- 6.36③ 若已知两棵二叉树B1和B2皆为空,或者皆 不空且B1的左、右子树和B2的左、右子树分别相似, 则称二叉树B1和B2相似。试编写算法,判别给定两 棵二叉树是否相似。
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树