【資料結構】二叉樹遍歷(遞迴+非遞迴)

JatenLv發表於2017-12-18

二叉樹定義:

typedef struct BiTreeNode {
    char data;  
    struct BiTreeNode *left, *right;
} BiTreeNode, *BiTree;
複製程式碼

二叉樹的建立:

int CreatBiTree(Bitree &T) {
    char data;
    // 按先序次序輸入二叉樹中節點的值(一個字元),"#"表示空樹
    scanf("%c",data);
    if (data == '#') {
        T = NULL;
    } else {
        T = (BiTree)malloc(sizeof(BiTreeNode);
        // 生成根節點
        T -> data = data;
        // 構造左子樹
        CreateBiTree(T -> left);
        // 構造右子樹
        CreateBiTree(T -> right);
    }
    return 0;
}
複製程式碼

##【遞迴】

// 列印
void printTree(BiTree T) {
    if (T -> data != '#') {
        printf("%c",T -> data);
    }
}

// 先序遍歷
void PreOrder(BiTree T) {
    if (T != NULL) {
        printTree(T);
        PreOrder(T -> left);
        PreOrder(T -> right);
    }
}

// 中序遍歷
void InOrder(BiTree T) {
    if (T != NULL) {
        InOrder(T -> left);
        printTree(T);
        InOrder(T -> right);
    }
}

// 後序遍歷
void PostOrder(BiTree T) {
    if (T != NULL) {
        PostOrder(T -> left);
        PostOrder(T -> right);
        printTree(T);
    }
}
複製程式碼

【非遞迴】

// 先序遍歷
void PreOrder2(BiTree T) {
    stack<BiTree> stack;
    BiTree p = T; // p是遍歷指標
    while (p || !stack.empty()) {
        if (p != NULL) {
            stack.push(p); // 入棧
            printf("%c",p -> data);
            p = p -> left; 
        } else {
            p = stack.top();
            stack.pop();
            p = p -> right;
        }
    }
}

// 中序遍歷
void InOrder2(BiTree T) {
    stack<BiTree> stack;
    BiTree p = T; // p是遍歷指標
    while (p || !stack.empty()) {
        if (p != NULL) {
            stack.push(p); // 入棧
            p = p -> left; 
        } else {
            p = stack.top();
            printf("%c",p -> data);
            stack.pop();
            p = p -> right;
        }
    }
}

// 後序遍歷
typedef struct BiTreeNodePost {
    char tag;
    BiTree biTree;
}BiTreeNodePost, *BiTreePost;

void PostOrder2(BiTree T) {
    stack<BiTree> stack;
    BiTree p = T; // p是遍歷指標
    BiTreePost BT;
    while (p || !stack.empty()) {
        // 遍歷左子樹
        while (p != NULL) {
            BT = (BiTreePost)malloc(sizeof(BiTreeNodePost));
            BT -> biTree = p;
            // 訪問過左子樹
            BT -> tag = 'L';
            stack.push(BT);
            p = p -> child;
        }
        // 左右子樹訪問完畢訪問根節點
        while (!stack.empty() && (stack.top()) - > tag == 'R') {
            BT = stack.top();
            stack.pop();
            BT -> biTree;
            printf("%c",BT -> biTree -> data);
        }
        // 遍歷右子樹
        if (!stack.empty()) {
            BT = stack.top();
            // 訪問過右子樹
            BT -> tag = 'R';
            p = BT -> biTree;
            p = p -> right;
        }
    }
}

// 層次遍歷
void LevelOrder(BiTree T) {
    BiTree p = T;
    queue<BiTree> queue;
    queue.push(p);
    while(!queue.empty()) {
        // 對頭元素出隊
        p = queue.front();  
        // 訪問p指向的節點
        printf("%c",p -> data);
        queue.pop();
        if (p -> left != NULL) {
            queue.push(p -> left);
        }
        if (p -> right != NULL) {
            queue.push(p -> right);
        }
    }
}
複製程式碼

相關文章