// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std; typedef struct BTree{
char val;
struct BTree *lchild,*rchild;
}BTree; //先序建立二叉树
BTree * CreateBTree(BTree *T)
{
char value;
cin >> value;
if('#' == value)
T = NULL;
else
{
T = new BTree;
T->val = value;
cout<<"left of "<<T->val<<" :"<<endl;
T->lchild=CreateBTree(T->lchild);
cout<<"right of "<<T->val<<" :"<<endl;
T->rchild=CreateBTree(T->rchild);
}
return T;
}

/*建立二叉排序树*/
BTree* insertNode(BTree *Root,int value)
{
BTree* p=new BTree();
p->val=value;
p->lchild=NULL;
p->rchild=NULL;
if(Root==NULL)
{
Root=p;
return Root;
}
if(value<=Root->val)
Root->lchild=insertNode(Root->lchild,value);
else if(value>Root->val)
Root->rchild=insertNode(Root->rchild,value);
return Root;
} //先序遍历二叉树
void PreOrderTraverse(BTree* T){
if(T){
printf("%c ",T->val);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
} //中序遍历
void InOrderTraverse(BTree* T){
if(T){
InOrderTraverse(T->lchild);
printf("%c ",T->val);
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BTree* T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->val);
}
}
//递归遍历二叉树是否为二叉排序树
int IsSearchTree(BTree *t)
{
if(!t) //空二叉树情况
return ;
else if(!(t->lchild) && !(t->rchild)) //左右子树都无情况
return ;
else if((t->lchild) && !(t->rchild)) //只有左子树情况
{
if(t->lchild->val>t->val)
return ;
else
return IsSearchTree(t->lchild);
}
else if((t->rchild) && !(t->lchild)) //只有右子树情况
{
if(t->rchild->val<t->val)
return ;
else
return IsSearchTree(t->rchild);
}
else //左右子树全有情况
{
if((t->lchild->val>t->val) || (t->rchild->val<t->val))
return ;
else
return ( IsSearchTree(t->lchild) && IsSearchTree(t->rchild) );
}
}
/*写法复杂,但代码少的判断二叉排序树的方法*/
int Prev=INT_MIN;
int JudgeBST(BTree *t){
int b1,b2;
if (t==NULL)
return ;
else{
b1=JudgeBST(t->lchild);
if (b1==||Prev>=t->val)
return ;
Prev=t->val;
b2=JudgeBST(t->rchild);
return b2;
}
} int main(int argc, char* argv[])
{
/*建立*/
BTree *root=new BTree();
printf("creating a binary tree with root:\n");
root=CreateBTree(root);
/*输出*/
PreOrderTraverse(root);
printf("\n");
InOrderTraverse(root);
printf("\n");
PostOrderTraverse(root);
printf("\n");
/*是否排序树*/
printf("%d\n",IsSearchTree(root));
printf("%d\n",JudgeBST(root)); system("pause");
return ;
}

二叉排序树即中序遍历结果为递增的二叉树,如:

二叉树建立,遍历和二叉排序树的判断【c++】的更多相关文章

  1. 二叉树 - 建立与遍历使用Java

    二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...

  2. 12 二叉树-链式存储-二叉排序树(BST)

    呜呜 写这个东西花了我2天 居然花了两天!!我还要写AVL呢啊啊啊啊啊啊啊!!!!!! 等下还要跑去上自习 大早上起来脸都没洗现在先赶紧发博客 昨晚写出来了独自在其他人都睡着了的宿舍狂喜乱舞.. 迷之 ...

  3. java二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  4. 【PHP数据结构】二叉树的遍历及逻辑操作

    上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...

  5. [Leetcode] Binary tree level order traversal二叉树层次遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

    树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分 ...

  7. 剑指offer第二版-总结:二叉树的遍历

    思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则 ...

  8. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的三种遍历方法: 先序,中序,后序,这三种遍历方式每一个都可以用递归,迭代,Morris三种形式实现,其中Morris效率最高,空间复杂度为O(1). 主要参考博客: 二叉树的遍历(递归,迭代, ...

  9. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

随机推荐

  1. Android的setVisibility(View.GONE)无效的问题及原因分析(转)

    出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉s ...

  2. jQuery如何在IE中更改网页标题

    标准上来说,要改变title值要操作document而不是title节点.在IE下不能通过操作title节点来改变document.title. 本来用原生的JavaScript很简单就解决了: do ...

  3. LeetCode:Count and Say

    题目链接 The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 11 ...

  4. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  5. 图解Javascript原型链

    本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关 ...

  6. .NET 学习书籍推荐

    时间过得好快啊,转眼三月过了1周多了,今天把看书的目录记录下,方便初学者 最近由于项目需要研究下dotnet 技术,参考书籍如下: 1.深入理解C# 2.CLR via  C# 3.Framework ...

  7. javascript变量声明 及作用域

    javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...

  8. 使用Shell创建GitHub仓库

    Github的代码仓库分为2种类型: 用户自己的代码仓库 组织的代码仓库 下面就使用Shell脚本创建这2种类型的代码仓库,脚本如下 创建用户自己的代码仓库 #!/bin/bash USER_NAME ...

  9. <<< tomcat启动报错StandardServer.await: create[8005]

    启动tomcat的时候出现异常 严重: StandardServer.await: create[8005]: java.net.BindException: Address already in u ...

  10. Java中vector的使用详解

    Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...