二叉树建立,遍历和二叉排序树的判断【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 1;
    else if(!(t->lchild) && !(t->rchild))   //左右子树都无情况
        return 1;
    else if((t->lchild) && !(t->rchild))    //只有左子树情况
    {
        if(t->lchild->val>t->val)
            return 0;
        else
            return IsSearchTree(t->lchild);
    }
    else if((t->rchild) && !(t->lchild))   //只有右子树情况
    {
        if(t->rchild->val<t->val)
            return 0;
        else
            return IsSearchTree(t->rchild);
    }
    else         //左右子树全有情况
    {
        if((t->lchild->val>t->val) || (t->rchild->val<t->val))
            return 0;
        else
            return ( IsSearchTree(t->lchild) && IsSearchTree(t->rchild) );
    }
}
/*写法复杂,但代码少的判断二叉排序树的方法*/
int Prev=INT_MIN;
int JudgeBST(BTree *t){
    int b1,b2;
    if (t==NULL)
        return 1;
    else{
        b1=JudgeBST(t->lchild);
        if (b1==0||Prev>=t->val)
            return 0;
        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 0;
}

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

时间: 2024-08-09 19:47:38

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

二叉树建立和遍历

二叉树创建遍历规则: 1.先序:根-左-右 2.中序:左-根-右 3.后序:左-右-根 二叉树定义和辅助函数如下: struct node { int data; struct node* left; struct node* right; }; void visit(int data) { printf("%d ", data); } int indata() { int data; scanf("%d",&data); return data; } 先序

二叉树的遍历与建立

二叉树简介 二叉树是一种非线性结构,二叉树的遍历方式有三种:前序.中序和后序.  在学习二叉树的时候,把二叉树分为三部分:根结点,左子树和右子树,所谓遍历方式即访问这三部分的先后顺序. 我对于二叉树遍历的方式的理解是這样的: 前序遍历:先访问根结点,再访问左子树,最后访问右子树. 中序遍历:先访问左子树,再访问根节点,最后访问右子树. 后序遍历:先访问左子树,再访问右子树,最后访问根结点. 1.二叉树的建立 #define _CRT_SECURE_NO_WARNINGS 1 #include<i

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

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根节点,然后前序遍历左子树,再前序遍历右子树 中序遍历:若二叉树为空,则空操作返回null.否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树 后序遍历:若二叉树为空,则空操作返回null.否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点 层序遍历:若树为空,空

【转】算法之二叉树各种遍历

http://blog.csdn.net/sjf0115/article/details/8645991 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

二叉树各种遍历

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,

算法之二叉树各种遍历 (转)

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,

转 算法之二叉树各种遍历

原文:http://blog.csdn.net/sjf0115/article/details/8645991 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个

经典白话算法之二叉树各种遍历

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,如果其终端