zoukankan      html  css  js  c++  java
  • 二叉树建立,遍历和二叉排序树的判断【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: "); root=CreateBTree(root); /*输出*/ PreOrderTraverse(root); printf(" "); InOrderTraverse(root); printf(" "); PostOrderTraverse(root); printf(" "); /*是否排序树*/ printf("%d ",IsSearchTree(root)); printf("%d ",JudgeBST(root)); system("pause"); return 0; }

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

  • 相关阅读:
    山东理工大学ACM平台题答案关于C语言 1137 C/C++经典程序训练7---求某个范围内的所有素数
    又遇BUG-ORA-01148:数据文件忽然变为recover状态
    poj 1191 棋盘分割 动态规划
    libevent的使用方法--回显服务器的简单实例
    java.lang.OutOfMemory总结分析
    山东理工大学ACM平台题答案关于C语言 1580 闰年
    SAE搭建WordPress教程 免费建WordPress博客站
    编译小结(6)认识Automake
    PHP再学习1——cURL表单提交、HTTP请求和响应分析
    新手一步一步OpenCV+Win7+Visual Studio 2013环境配置
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/5894019.html
Copyright © 2011-2022 走看看