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)時間的