二叉树建立,遍历和二叉排序树的判断【c++】
// 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++】的更多相关文章
- 二叉树 - 建立与遍历使用Java
二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...
- 12 二叉树-链式存储-二叉排序树(BST)
呜呜 写这个东西花了我2天 居然花了两天!!我还要写AVL呢啊啊啊啊啊啊啊!!!!!! 等下还要跑去上自习 大早上起来脸都没洗现在先赶紧发博客 昨晚写出来了独自在其他人都睡着了的宿舍狂喜乱舞.. 迷之 ...
- java二叉树的遍历(1)
树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...
- 【PHP数据结构】二叉树的遍历及逻辑操作
上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...
- [Leetcode] Binary tree level order traversal二叉树层次遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作
树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分 ...
- 剑指offer第二版-总结:二叉树的遍历
思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则 ...
- 二叉树的遍历(递归,迭代,Morris遍历)
二叉树的三种遍历方法: 先序,中序,后序,这三种遍历方式每一个都可以用递归,迭代,Morris三种形式实现,其中Morris效率最高,空间复杂度为O(1). 主要参考博客: 二叉树的遍历(递归,迭代, ...
- C++ 二叉树深度优先遍历和广度优先遍历
二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...
随机推荐
- 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...
- 第一个Android应用--签证无忧 上线
用了大概1个多星期的时间,把一个简单的应用完成,[签证无忧]是基于在我所在公司办理签证的前提下,为方便客户查询进度所开发,后来我加了淘宝的购买链接,这样客人在以后需要时不需要到淘宝查找了. 签证无忧这 ...
- ECharts学习(1)--简单图表的绘制
1.获取ECharts 官网 下载:http://echarts.baidu.com/download.html 2.在html页面中引入ECharts文件 <!DOCTYPE html> ...
- iOS对键盘的处理
方法1. 使用<UITextFeildDelegate>,使用的UITextField示例 设置其Delegate为self,点击return按钮隐藏键盘.实现函数如下: - (BO ...
- 文件操作之FileOpenPicker、FileSavePicker和FolderPicker
Win10的开发经常需要进行文件的操作,因此文件的选择对话框FileOpenPicker.文件保存对话框FileSavePicker以及文件夹选择对话框FolderPicker十分重要.这三者的操作也 ...
- 解决:Microsoft Office Word已停止工作
1/按组合键WIN+R打开运行对话框 2/在打开框中键入%USERPROFILE%\AppData\Roaming\Microsoft\Templates,单击“确定”按钮 3/在打开的窗口鼠标右键删 ...
- android开发之线程
线程(android) 在java中我们学习了线程,线程,是进程的一个单位,在程序要运行时,会开启线程,运行程序,我们要创建线程就需要我们去继承接口Thread或者实现Runabl ...
- php魔术方法使用场景
php魔术方法-----__tostring(),__invoke,__call(),__callStatic ... __tostring(),__invoke() __tostring()方法是在 ...
- bzoj 1305 dance跳舞
最大流. 首先二分答案,问题转化为x首舞曲是否可行. 考虑建图,对每个人建立三个点,分别表示全体,喜欢和不喜欢. 源点向每个男生全体点连一条容量为x的边. 每个男生整体点向喜欢点连一条容量为正无穷的边 ...
- Bzoj1096 [ZJOI2007]仓库建设
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4193 Solved: 1845 Description L公司有N个工厂,由高到底分布在一座山上. ...