1. 程式人生 > >二叉樹--(建樹,前序,中序,後序)--遞歸和非遞歸實現

二叉樹--(建樹,前序,中序,後序)--遞歸和非遞歸實現

reorder 前序 非遞歸後序遍歷 truct new tac preorder recursive while

    #include<iostream>
    #include<string.h>
    #include<stack>
    using namespace std;
    typedef struct BTree
    {
        int val;
        struct BTree *left,*right;
    }BTree;
    class Tree
    {
        public:
        BTree *create_node(int level,string pos);
        
void PreOrder(BTree *t); //先序遍歷 void InOrder(BTree *t); //中序遍歷 void PostOrder(BTree *t); //後序遍歷 void NonRecursivePreOrder(BTree*t); //非遞歸前序遍歷 void NonRecursiveInOrder(BTree*t); //非遞歸中序遍歷 void NonRecursivePostOrder(BTree*t);//非遞歸後序遍歷 BTree *root; }; BTree
* Tree::create_node(int level,string pos) { int data; BTree *node = new BTree; int a[]={100,99,98,97,0,0,20,0,0,10,0,0,5,1,0,0,2,0,0}; static int t=0; cout<<"please enter data:level "<<level<<" "<<pos<<"--->值為:"<<a[t]<<endl; data
=a[t++]; if(data == 0) { return NULL; } node->val= data; node->left = create_node(level+1,"left"); node->right= create_node(level+1,"right"); return node; } void Tree::PreOrder(BTree *t) { if(t) { cout<<t->val<<" ";; PreOrder(t->left); PreOrder(t->right); } } void Tree::InOrder(BTree *t) { if(t) { InOrder(t->left); cout<<t->val<<" ";; InOrder(t->right); } } void Tree::PostOrder(BTree *t) { if(t) { PostOrder(t->left); PostOrder(t->right); cout<<t->val<<" "; } } void Tree::NonRecursivePreOrder(BTree*t) { if(t==NULL) return; stack<BTree*>s; BTree *p; p=t; while(p||!s.empty()) { if(p) { cout<<p->val<<" "; s.push(p); p=p->left; } else{ p=s.top(); p=p->right; s.pop(); } } } void Tree::NonRecursiveInOrder(BTree*t) { if(t==NULL) return; stack<BTree*>s; BTree*p; p=t; while(p||!s.empty()) { if(p) { s.push(p); p=p->left; } else { p=s.top(); cout<<p->val<<" "; p=p->right; s.pop(); } } } void Tree::NonRecursivePostOrder(BTree*t) { if(t==NULL) return; stack<BTree*>s; BTree*p=t; BTree*r; while(p||!s.empty()) { if(p) { s.push(p); p=p->left; } else { p=s.top(); if(p->right&&p->right!=r) { p=p->right; s.push(p); p=p->left; } else { cout<<p->val<<" "; r=p; s.pop(); p=NULL; } } } } int main() { Tree tree; tree.root = tree.create_node(1,"root"); cout<<"Pre"<<endl; tree.PreOrder(tree.root); cout<<endl; cout<<"非遞歸前序遍歷"<<endl; tree.NonRecursivePreOrder(tree.root); cout<<endl; cout<<"In"<<endl; tree.InOrder(tree.root); cout<<endl; cout<<"非遞歸中序遍歷"<<endl; tree.NonRecursiveInOrder(tree.root); cout<<endl; cout<<"Post"<<endl; tree.PostOrder(tree.root); cout<<endl; cout<<"非遞歸後序遍歷"<<endl; tree.NonRecursivePostOrder(tree.root); return 0; }

結果:

please enter data:level 1 root--->值為:100
please enter data:level 2 left--->值為:99
please enter data:level 3 left--->值為:98
please enter data:level 4 left--->值為:97
please enter data:level 5 left--->值為:0
please enter data:level 5 right--->值為:0
please enter data:level 4 right--->值為:20
please enter data:level 5 left--->值為:0
please enter data:level 5 right--->值為:0
please enter data:level 3 right--->值為:10
please enter data:level 4 left--->值為:0
please enter data:level 4 right--->值為:0
please enter data:level 2 right--->值為:5
please enter data:level 3 left--->值為:1
please enter data:level 4 left--->值為:0
please enter data:level 4 right--->值為:0
please enter data:level 3 right--->值為:2
please enter data:level 4 left--->值為:0
please enter data:level 4 right--->值為:0
Pre
100 99 98 97 20 10 5 1 2 
非遞歸前序遍歷
100 99 98 97 20 10 5 1 2 
In
97 98 20 99 10 100 1 5 2 
非遞歸中序遍歷
97 98 20 99 10 100 1 5 2 
Post
97 20 98 10 99 1 2 5 100 
非遞歸後序遍歷
97 20 98 10 99 1 2 5 100 

二叉樹--(建樹,前序,中序,後序)--遞歸和非遞歸實現