程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二叉樹的基本操作

二叉樹的基本操作

編輯:C++入門知識

由於崗位實踐需要,故寫了一個樹的基本操作,包括先,中,後序遞歸和非遞歸,計算高度,計算左子樹個數,無其他用處,警示自己而已 ..
[cpp] 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stack> 
using namespace std; 
 
// tree node 
typedef struct TreeNode { 
    char data; 
    struct TreeNode* lChild; 
    struct TreeNode* rChild; 
} Node; 
 
int n; 
stack<Node*> s; 
 
// 先序 create tree 
void createTree(Node **t, char *c) 

    n++; 
    if(n > strlen(c) - 1) return; 
    if(c[n] == '0') *t = NULL; 
    else  
    { 
        (*t) = (Node*)malloc(sizeof(Node)); 
        (*t)->data = c[n]; 
        createTree(&(*t)->lChild, c); 
        createTree(&(*t)->rChild, c); 
    } 

// 先序遞歸訪問 
void preVisit(Node *t) 

    if(t) 
    { 
        printf("%c", t->data); 
        preVisit(t->lChild); 
        preVisit(t->rChild); 
    } 

// 中序遞歸訪問 
void midVisit(Node *t) 

    if(t) 
    { 
        midVisit(t->lChild); 
        printf("%c", t->data); 
        midVisit(t->rChild); 
    } 

// 後序遞歸訪問 
void lastVisit(Node *t) 

    if(t) 
    { 
        lastVisit(t->lChild); 
        lastVisit(t->rChild); 
        printf("%c", t->data); 
    } 

 
 
// 先序非遞歸訪問 
void uPre(Node* head) 

    while(!s.empty()) s.pop(); 
    while(head || !s.empty()) 
    { 
        while(head) 
        { 
            printf("%c", head->data); 
            s.push(head); 
            head = head->lChild; 
        } 
        if(!s.empty()) 
        { 
            head = s.top(); 
            s.pop(); 
            head = head->rChild; 
        } 
    } 

 
// 中序非遞歸訪問 
void uMid(Node* head) 

    while(!s.empty()) s.pop(); 
    while(head || !s.empty()) 
    { 
        while(head) 
        { 
            s.push(head); 
            head = head->lChild; 
        } 
        if(!s.empty()) 
        {    
            head = s.top(); 
            printf("%c", head->data); 
            s.pop(); 
            head = head->rChild; 
        } 
    } 
 

// 後序非遞歸訪問 
void uLast(Node* head) 

    Node *p = head; 
    head = NULL; 
    while(!s.empty()) s.pop(); 
    do 
    { 
        while(p) 
        { 
            s.push(p); 
            p = p->lChild; 
        } 
        p = s.top(); 
        p = p->rChild; 
        if(head == p || p == NULL) 
        { 
            head = s.top(); 
            s.pop(); 
            printf("%c", head->data); 
            p = NULL; 
        } 
    }while(!s.empty()); 

// 計算高度 
int calH(Node* head) 

    if(!head) return 0; 
    int left = calH(head->lChild); 
    int right = calH(head->rChild); 
    int h; 
    if(left > right) { 
        h = left + 1; 
    } 
    else  
    { 
        h = right + 1; 
    } 
    return h; 

 
// 計算左子葉子個數 
int calLeftChild(Node *t) 

    if(!t) return 0; 
    else if(t->lChild && !t->lChild->lChild && !t->lChild->rChild) return 1; 
    else return calLeftChild(t->lChild) + calLeftChild(t->rChild); 

 
int main() 

    char a[1000]; 
    int c; 
    scanf("%d", &c); 
    while(c--) 
    { 
        n = -1; 
        scanf("%s", a); 
        Node *head; 
        createTree(&head, a); 
        preVisit(head); 
        putchar('\n'); 
        midVisit(head); 
        putchar('\n'); 
        lastVisit(head); 
        putchar('\n'); 
        printf("非遞歸先序\n"); 
        uPre(head); 
        putchar('\n'); 
        printf("\n非遞歸中序\n"); 
        uMid(head); 
        putchar('\n'); 
        printf("\n非遞歸後序\n"); 
        uLast(head); 
        putchar('\n'); 
        printf("\n%d\n", calH(head)); 
        printf("%d\n", calLeftChild(head)); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved