先序非遞歸建立二叉樹


  大二這么久了,第一個學期課程實在太少,而且全都不是CS的專業課,無奈,若是自己不勤奮一點,過了半年,用不到半年,就又變回小白了。所以自己最近也在重新鞏固數據結構的知識。剛好看到二叉樹這里,覺得二叉樹應用廣泛,復習的比較細致。

  剛開始就是二叉樹的建立了,大多數地方都是先序的遞歸創建,於是便想着試試非遞歸的代碼,倒騰了個把小時,基本上弄出代碼了,本渣渣水平有限,有錯誤的地方,望路過的大神不吝賜教~~不勝感激!

  主要的思路是:

          按照先序的順序輸入二叉樹,若是遇到空子樹,用字符‘#‘表示,例如

左圖:AB#D##CE###
 
 
   ( 1)若第一次輸入就是’#‘,則創建的是空樹。
  (2)每次創建一個新的結點p,看棧頂元素的flag,若為0,則取出(不出棧)棧頂指針R,並將其flag修改為1.R->child=p;
                      若flag本身就是1,則直接取棧頂(出棧)!R-rchild=p;
       然后將p入棧。入棧的flag初始值是0;
  (3)當棧為空時,二叉樹就建好了。
代碼:
 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<malloc.h>
 4 using namespace std;
 5 typedef struct BiTNode
 6 {
 7     char c;
 8     struct BiTNode *lchild,*rchild;
 9 }BiTNode,*BiTree;
10 typedef struct
11 {
12     BiTree x;
13     int flag;
14 }snode;
15 typedef struct
16 {
17     snode sdata[100];
18     int top;
19 }Stack;
20 int Empty(Stack s)
21 {
22     if(s.top==-1) return 1;
23     else return 0;
24 }
25 void Pop(Stack &s,BiTree R)          //取棧頂元素,flag=1標志已經被取過一次
26 {
27     R=s.sdata[s.top].x;
28     s.sdata[s.top].flag=1;
29 }
30 void Out(Stack &s,BiTree R)         //取棧頂元素,並且棧頂元素出棧
31 {
32     R=s.sdata[s.top].x;
33     s.top--;
34 }
35 void In(Stack &s,BiTree R)          //指針入棧,flag=0標志從未被取過
36 {
37     s.top++;
38     s.sdata[s.top].x=R;
39     s.sdata[s.top].flag=0;
40 }
41 void CreateBiTree(BiTree T)
42 {
43     char ch;
44     Stack s;
45     T=NULL;
46     s.top=-1;
47     BiTree R=T,p;
48     do
49     {
50         cin>>ch;
51         if(Empty(s)&&ch=='#')
52             return;
53         else if(ch!='#')
54         {
55             p=(BiTree)malloc(sizeof(BiTNode));
56             p->c=ch;
57             if(Empty(s))
58             {
59                 T=p;
60                 R=p;
61             }
62             else if(s.sdata[s.top].flag==0)
63             {
64                 Pop(s,R);
65                 R->lchild=p;
66             }
67             else
68             {
69                 Out(s,R);
70                 R->rchild=p;
71             }
72             In(s,p);
73         }
74         else
75         {
76             if(s.sdata[s.top].flag==0)
77             {
78                 Pop(s,R);
79 
80                 R->lchild=NULL;
81             }
82             else
83             {
84                 Out(s,R);
85                 R->rchild=NULL;
86             }
87         }
88     }while(s.top!=-1);
89 }
90 int main()
91 {
92     BiTree T;
93     CreateBiTree(T);
94 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM