排序二叉树删除节点、二叉树后序、先序非递归遍历

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef char ElemType; 
  4 
  5 typedef struct BiNode{
  6     ElemType data;
  7     BiNode* lchild;
  8     BiNode* rchild;     
  9     BiNode(ElemType data, BiNode* lchild, BiNode* rchild) {
 10         this->data = data;
 11         this->lchild = lchild;
 12         this->rchild = rchild;
 13     }   
 14 }*BiTree;
 15 
 16 stack<BiTree>s;
 17 
 18 void postorder(BiTree T){
 19     BiTree p=T;
 20     BiTree r=NULL;
 21     while(p||!s.empty()){
 22         if(p){
 23             s.push(p);
 24             p=p->lchild;
 25         }
 26         else{
 27             p=s.top();
 28             if(p->rchild&&p->rchild!=r)p=p->rchild;
 29             else{
 30                 s.pop();
 31                 printf("%c",p->data);
 32                 r=p;
 33                 p=NULL;
 34             }
 35         }
 36     }
 37 
 38 }
 39 
 40 void preorder(BiTree T){
 41     while(T||!s.empty()){
 42         //if(s.empty())printf("q");
 43         if(T){
 44             printf("%c",T->data);
 45             s.push(T);
 46             T=T->lchild;
 47         }
 48         else{
 49             T=s.top();
 50             s.pop();
 51             T=T->rchild;
 52         }
 53         
 54 
 55     }
 56 }
 57 
 58 void delnode(BiTree &p){
 59     if(!p->lchild)p=p->rchild;
 60     else if(!p->rchild)p=p->lchild;
 61     else{
 62         BiTree t=p->rchild;
 63         BiTree q=p;
 64         while(t->lchild){
 65             q=t;
 66             t=t->lchild;
 67         }
 68         p->data=t->data;
 69         if(q==p){
 70             p->rchild=t->rchild;
 71             //free(t);
 72         }
 73         else{
 74             q->lchild=t->rchild;
 75             t=NULL;
 76         }
 77     }
 78 }
 79 
 80 BiTree findnode(BiTree &T,char x){
 81     if(!T||T->data==x){
 82         delnode(T);
 83         return T;
 84     }
 85     if(x<T->data)return findnode(T->lchild,x);
 86     return findnode(T->rchild,x);
 87 }
 88 
 89 int main(){
 90     /*BiNode* v4 = new BiNode('4', NULL, NULL);
 91     BiNode* v6 = new BiNode('6', NULL, NULL);
 92     BiNode* v5 = new BiNode('5', v4, v6);
 93     BiNode* v1 = new BiNode('1', NULL, NULL);
 94     BiNode* v3 = new BiNode('3', v1, v5);
 95     BiNode* v7 = new BiNode('7', v3, NULL);*/
 96     BiNode* v7 = new BiNode('7', NULL, NULL);
 97     BiNode* v1 = new BiNode('1', NULL, NULL);
 98     BiNode* v3 = new BiNode('3', NULL, NULL);
 99     BiNode* v2 = new BiNode('2', v1, v3);
100     BiNode* v5 = new BiNode('5', NULL, NULL);
101     BiNode* v6 = new BiNode('6', v5, v7);
102     BiNode* v4 = new BiNode('4', v2, v6);
103     //BiNode* T = v4;*/
104     BiTree T=v7;
105     preorder(T);
106     printf("
");
107     findnode(T,'3');
108     preorder(T);
109     printf("
");
110     postorder(T);
111 }