二叉樹的遞迴遍歷與非遞迴遍歷

2021-07-25 10:39:38 字數 2649 閱讀 8485

二叉樹的遞迴遍歷與非遞迴遍歷

#include

#include

#include

/* 本程式實現二叉樹的建立,遞迴遍歷與非遞迴遍歷 */

typedef struct tnode

tnode,*pnode;

//構造二叉樹

pnode createtree()

else

pnode->

data

=data;

pnode->lchild = createtree();

pnode->rchild = createtree();

}return pnode;

} //遞迴先序遍歷二叉樹

void preordertree(pnode root)

}//中序

void inordertree(pnode root)

} //後序

void postordertree(pnode root)

} //非遞迴遍歷

typedef struct snode

snode,*psnode;

typedef struct stack

stack,*pstack;

//初始化乙個空棧用於存放遍歷過程中的臨時樹的節點指標

pstack initstack()

psnode->next =

null;

pstack->bottom = psnode;

pstack->top = psnode;

return pstack;

} //判斷棧是否為空

bool isempty(pstack pstack)

//節點指標入棧

void push(pstack pstack,pnode pnode)

psnode->pnode = pnode;

psnode->next = pstack->top;

pstack->top = psnode;

// printf("%d入棧\n",pnode->data);

} //獲取棧頂元素樹指標節點

pnode top(pstack pstack)

// printf("獲取棧頂元素%d\n",pstack->top->pnode->data);

return pstack->top->pnode;

}//出棧

void pop(pstack pstack)

psnode psnode = pstack->top;

pstack->top = psnode->next;

// printf("出棧%d\n",psnode->pnode->data);

free(psnode);

} //遍歷棧元素

void printstack(pstack pstack)

else}}

//非遞迴先序遍歷

void preorder(pnode root)

if(!isempty(pstack))

}

}//非遞迴中序遍歷

void inorder(pnode root)

if(!isempty(pstack))

}} //層次遍歷數,shiyongduilie使用佇列實現

typedef struct qnode

qnode,*pqnode;

typedef struct queue

queue,*pqueue;

pqueue initqueue()

pqueue->front = pqueue->rear = pqnode;

pqueue->rear->next =

null;

return pqueue;

}bool empty(pqueue pqueue)

void enqueue(pqueue pqueue,pnode pnode)

pqnode pqnode = (pqnode)malloc(sizeof(qnode));

if(pqnode==

null)

pqnode->pnode = pnode;

pqnode->next =

null;

pqueue->rear->next = pqnode;

pqueue->rear = pqnode;

}pnode getqueue(pqueue pqueue)

return pqueue->front->next->pnode;

}void dequeue(pqueue pqueue)

pqnode pqnode=pqueue->front->next;

pqueue->front->next = pqnode->next;

// printf("%d出隊\n",pqnode->pnode->data);

if(pqnode==pqueue->rear)

free(pqnode);

} void levelorder(pnode root)

if(p->rchild!=

null)

}}int main(int argc, char *argv)

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遍歷有遞迴與非遞迴兩種方式,但思想大致相同 前序 先列印然後遍歷完他的左子樹,左子樹為空時開始返回,並且開始以棧中元素為根遍歷右子樹 中序 先遍歷左子樹然後左子樹入棧,左子樹為空再列印,再遍歷右子樹 後序 先遍歷完左子樹,左子樹入棧儲存,再遍歷右子樹,遍歷完列印,否則繼續入棧 遞迴遍歷 遞迴...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹遞迴遍歷和非遞迴遍歷

用遞迴和非遞迴實現二叉樹的前序遍歷 中序遍歷和後序遍歷並列印出相應結果。private class treenode 在遞迴呼叫時候系統自動給我們建立棧來儲存資料,而使用非遞迴時候需要我們自己實現棧來儲存資料。遞迴實現前序遍歷public void preorder treenode root sy...