1. 程式人生 > >c語言實現二叉樹(二叉連結串列)非遞迴後序遍歷

c語言實現二叉樹(二叉連結串列)非遞迴後序遍歷

  • 演算法思想

因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。

#include<iostream>
using namespace std;

typedef  char ElemType;
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//建立二叉樹
void CreateBT(BiTree &T){
    char ch;
    cin>>ch; //先輸入節點值 
    if(ch == '#') T=NULL; //遞迴結束建空樹 
    else{
        T = new BiTNode;  ///生成結點 
        T->data=ch;
        CreateBT(T->lchild);
        CreateBT(T->rchild);
    }

    
void PostOrder(BiTree T){
    BiTree stack[10];
    int top=-1;
    BiTree p=T,r=NULL;
    
    while( p || top>-1){
        if(p){  //走到最左邊 
            stack[++top]=p;
            p=p->lchild;
        }
        else{  //向右
            p=stack[top];  //取棧頂元素 
            if(p->rchild && p->rchild !=r){ //右子樹不空,且未陪訪問 
                p=p->rchild;  //轉向右 
                stack[++top]=p;   //壓棧 
                p=p->lchild;  //再走到最左 
            }
            else{   //否則彈出棧,並訪問 
                p=stack[top--];//出棧,並獲得棧頂元素
                cout<<p->data;
                r=p;   //記錄最近訪問過的結點 
                p=NULL; //結點訪問過,重置p指標 
            }
        }
    }
}

int main(){
    BiTree T=NULL;
    CreateBT(T);
    PostOrder(T);
    return 0;

相關推薦

c語言實現連結串列

演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost

【LeetCode-面試演算法經典-Java實現】【145-Binary Tree Postorder Traversal

原題   Given a binary tree, return the postorder traversal of its nodes’ values.   For exampl

【leetcode】145Binary Tree Postorder Traversal

二叉樹後序遍歷非遞迴方法很多書和部落格已經講的很清楚啦,這裡就是記錄一下方便自己日後看 基本思路是: 利用棧來實現 先找到最左節點,過程中的節點都入棧 如果該節點沒有右孩子或前一步訪問了右孩子(根據後序遍歷二叉樹的特點可以知道,如果當前節點有右孩子,則訪問當前節點前一定是

每日一題之 列印所有路徑

描述 給一個二叉樹,列印其所有路徑 思路: 利用後序非遞迴遍歷,因為後序非遞迴遍歷的特性,對於每次訪問的節點,棧裡面存的元素都是當前節點的祖先,所以只要判斷當前節點是不是葉子節點,如果是葉子節點,那麼將棧中元素取出,和當前葉子節點組成一條路徑。 #include <

利用求解最近公共祖先問題

通過上一篇的部落格我們知道,可以利用棧來實現二叉樹的後序遍歷。其實這裡有一個性質,就是當使用非遞迴後序遍歷時,棧中的元素就是當前節點到根節點的路徑。利用這個規律,我們就可以求解最近公共最先問題了。 演算法 找出兩個節點各自到根節點的路徑。這裡利

演算法

與正常的非遞迴中序遍歷演算法不同於兩點: 一  比正常的中序遍歷演算法多了對資料元素的標記。        在壓資料元素入棧(標記記為0,用來表示訪問了其左子樹)時標記,       還有訪問完左子樹利用gettop()獲取雙親通過p=p->rchild進一步訪問右子

實現

#include "stdio.h" #include "stdlib.h" typedef struct TreeNode *Tree; typedef char ElementType; typedef struct stack *Stack; typedef Tree

【LeetCode】 230. Kth Smallest Element in a BST

因為這是一棵二叉搜尋樹,所以找它的第 kkk 小值,就是這棵二叉搜尋樹的中序遍歷之後的第 kkk 個數,所以只需要將這棵樹進行中序遍歷即可,下面程式碼是非遞迴形式的二叉樹中序遍歷。 程式碼如下: /**

LeetCode題解-144. Binary Tree Preorder Traversal

題目:Given a binary tree, return the preorder traversal of its nodes' values.Example:Input: [1,null,2,3] 1 \ 2 / 3 Outpu

資料結構 筆記-6

如下這棵二叉樹的先序遍歷結果為:ABDEFPC 針對於上面的這棵二叉樹,結合程式碼,講述遍歷過程: #include <stdio.h>#include <malloc.h> //#define ElemType

資料結構 筆記-7

二叉樹的 非遞迴 中序遍歷 //#define ElemType char   typedef char ElemType; 結點中存放的資料的型別的定義  

java之中

思路:使用輔助棧改寫遞迴程式,中序遍歷沒有前序遍歷好寫,其中之一就在於入棧出棧的順序和限制規則。我們採用「左根右」的訪問順序可知主要由如下四步構成。 步驟: 1.首先需要一直對左子樹迭代並將非空節點入棧 2.節點指標為

演算法詳解

注意學習這個演算法需要隨時可以在腦海中輸出二叉樹的中序遍歷的序列 舉例: 如上圖,我們就看到一棵二叉樹:那麼我們是不是馬上可以想到這棵二叉樹的中序遍歷序列是什麼呢? 我直接給出答案:D B EF A G H C I 我們如果不適用遞迴中序遍歷二叉樹

前幾天面試吃了一次癟,筆試題讓我非遞迴前序遍歷,我毫不猶豫的就寫了一個棧。然後利用壓棧將前驅遍歷迅速寫了出來,當時喜滋滋的尋思今天的又比較順利哈! 面試的時候,考官問我,能不能不用棧,不遞迴實現呢?我頓時呆了... ... 從來都沒有思考過這個問題!直接影響了我後面的答題!

c語言實現 歸先

停止 數據 節點 一個 null front getchar() getc 輸入 1 #include<stdio.h> 2 #include<conio.h> 3 #include<malloc.h> 4 typedef ch

c語言實現通用資料結構:通用佇列

     注意佇列中只儲存了指標,沒有儲存實際的資料。      標頭檔案 myQueue.h #ifndef MYQUEUE_H_INCLUDED #define MYQUEUE_H_INCLUDED #include "myList.h" typedef My

劍指offer之求的深度的層次Java實現

劍指offer上一道比較基礎的題目,但這個解法不僅可以求二叉樹的深度同時可以求二叉樹的最大層數,某一層的某一個節點 是一種比較通用的方法! 先建立資料模型 package Binary_tree; public class Node {//二叉樹節點 priva

Python實現歸先

結果 leetcode logs [] 列表 遍歷 不存在 preorder bin 思路: 1. 使用列表保存結果; 2. 使用棧(列表實現)存儲結點; 3. 當根結點存在,保存結果,根結點入棧; 4. 將根結點指向左子樹; 5. 根結點不存在,棧頂元素出棧,並將根結點指

的先()、中()、()及層次java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

的三種方式和Morris

二叉樹遍歷是二叉樹的最基本的操作,其實現方式主要有三種: 遞迴遍歷 非遞迴遍歷 Morris遍歷 遞迴遍歷的實現非常容易,非遞迴實現需要用到棧。而Morris演算法可能很多人都不太熟悉,其強大之處在於只需要使用O(1)的空間就能實現對二叉樹O(n)時間的