zoukankan      html  css  js  c++  java
  • 二叉树的建立以及遍历

    其实建立的方式和遍历是一个意思.也是利用了递归的原理.只不过在原来应该是输出结点的地方,改成了生成结点,然后给这个结点进行赋值操作。所以理解了遍历就很容易理解建立.

      1 #include "stdafx.h"
      2 #include <iostream>
      3 #include <exception>
      4 #include<string>
      5 using namespace std;
      6 
      7 
      8 typedef char TElemType;
      9 typedef int Status;
     10 const int ok = 1;
     11 const int error = 0;
     12 typedef struct BiTNode
     13 {
     14     TElemType data;
     15     struct BiTNode *left,*right;
     16 }BiTNode,*BiTree;
     17 
     18 //前序遍历
     19 void PreOrderTraverse(BiTree T)
     20 {
     21     if(T==NULL) return;
     22     cout<<T->data<<" ";//显示该结点的数据
     23     PreOrderTraverse(T->left);
     24     PreOrderTraverse(T->right);
     25 }
     26 //中序遍历
     27 void InOrderTraverse(BiTree T)
     28 {
     29     if(T==NULL) return ;
     30     InOrderTraverse(T->left);
     31     cout<<T->data<<" ";
     32     InOrderTraverse(T->right);
     33 }
     34 
     35 //后序遍历
     36 void PostOrderTraverse(BiTree T)
     37 {
     38     if(T==NULL) return ;
     39     InOrderTraverse(T->left);
    
     40     InOrderTraverse(T->right);
     41     cout<<T->data<<" ";
     42 }
     43 
     44 //建立二叉树
     45 void CreateBiTree(BiTree &T)
     46 {
     47     TElemType ch;
     48     cin>>ch;
     49     if(ch=='#')
     50     {
     51         T=NULL;
     52     }else
     53     {
     54         T=(BiTree)malloc(sizeof(BiTree));
     55         if(!T)
     56             exit(OVERFLOW);
     57         T->data = ch;
     58         CreateBiTree(T->left);
     59         CreateBiTree(T->right);
     60     }
     61 }
     62 
     63 
     64 //线索二叉树的线索存储结构定义代码如下
     65  enum PointerTag{Link,Thread};//默认Link为0,Thread为1
     66 
     67 
     68 typedef struct BiThrNode
     69 {
     70     TElemType data;//结点数据
     71     struct BiThrNode *lchild,*rchild;//左右孩子指针
     72     PointerTag LTag;
     73     PointerTag RTag;
     74 }BithrNode,*BiThrTree;
     75 
     76 //中序遍历线索化的递归函数
     77 BiThrTree pre;//全局变量,始终指向刚刚访问过的结点.
     78 void InThreading(BiThrTree p)
     79 {
     80     if(p)
     81     {
     82         InThreading(p->lchild);//递归左子树线索化
     83         if(!p->lchild)
     84         {
     85             p->LTag = Thread;
     86             p->lchild = pre;
     87         }
     88         if(!pre->rchild)
     89         {
     90             p->RTag = Thread;
     91             p->rchild=p;
     92         }
     93         pre = p;
     94         InThreading(p->rchild);
     95     }
     96 }
     97 
     98 Status InOrderTraverse_Thr(BiThrTree T)
     99 {
    100     BiThrTree p;
    101     p = T->lchild;//p指向根结点
    102     while(p != T)//遍历结束时,p==T;
    103     {
    104         while (p->LTag==Link)//找到中序序列的第一个结点.一直找到最左边的左孩子
    105             p = p->lchild;
    106         cout<<p->data<<endl;//输出第一个元素.下面就不断输出后继
    107         while(p->RTag==Thread&&p->rchild!=T)//只要一直是后继,且不是T的话
    108         {
    109             p = p->rchild;
    110             cout<<p->data<<endl;
    111         }
    112         p = p->rchild;//p进至其右子树
    113 
    114     }
    115     return ok;
    116 
    117 }
    118 int _tmain(int argc, _TCHAR* argv[])
    119 { 
    120     
    121 
    122     return 0 ;
    123 }

    前序遍历输入:AB#D##C##就实现了.

  • 相关阅读:
    CodeForces
    CodeForces
    Comet OJ
    CodeForces
    2019年第五届计蒜之道复赛总结
    2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
    2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)
    2018计蒜之道复赛 贝壳找房函数最值(贪心+优先队列)
    牛客想开了大赛2 A-【六】平面(切平面)
    2018年第九届蓝桥杯国赛试题(JavaA组)
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3544364.html
Copyright © 2011-2022 走看看