二叉樹的遍歷是面試中經常考察的,其實前中後三種順序的遍歷都大同小異,自己模擬兩個棧用筆畫畫我相信是不難寫出代碼的。現羅列如下,均是自己所寫已通過leetcode。
1 class Solution {
2 public:
3 vector<int> preorderTraversal(TreeNode *root) {
4 vector<int> out;
5 stack<TreeNode*> s;
6 s.push(root);
7 while(!s.empty() && root){
8 TreeNode *node = s.top();
9 out.push_back(node->val);
10 s.pop();
11 if(node->right) s.push(node->right);
12 if(node->left) s.push(node->left);
13 }
14 return out;
15
16
17 }
18 vector<int> inorderTraversal(TreeNode *root) {
19 stack<TreeNode *> s;
20 vector<int> out;
21 TreeNode *node = root;
22 bool done = false;
23 while(!done){
24 if(node){
25 s.push(node);
26 node = node->left;
27 }else {
28 if(s.empty()) done = true;
29 else{
30 node = s.top();
31 s.pop();
32 out.push_back(node->val);
33 node = node->right;
34 }
35 }
36 }
37 return out;
38 }
39 vector<int> postorderTraversal(TreeNode *root) {
40 vector<int> out;
41 stack<TreeNode*> s;
42 TreeNode* node = root;
43 s.push(node);
44 while(!s.empty()&&node){
45 node = s.top();
46 out.push_back(node->val);
47 s.pop();
48 if(node->left) s.push(node->left);
49 if(node->right)s.push(node->right);
50 }
51 reverse(out.begin(),out.end());
52 return out;
53 }
54 };哈,我們數據結構的實驗:
typedef int Status;
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, * rchild;//左右孩子指針
}BiTNode, *BiTree;
typedef struct SqQueue
{
TElemType front ,rear ;
BiTree data[MAXQSIZE]; //循環隊列元素類型為二叉鏈表結點指針
int count;
}SqQueue; //循環隊列結構定義
int stack[MAX_TREE_SIZE],top=0;
Status CreateBiTree(BiTree *T)
{
//按先序輸入二叉樹中的結點的值(一個字符),空格字符表示空樹
//構造二叉鏈表表示的二叉樹T
TElemType input;
if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
fflush(stdin);
if(!fscanf(in,"%d",&input))
{
printf("Read Data Error!");
getch();
exit(0);
}
if(input==-1)
{
*T = NULL;
return FALSE;
}
else
{
(*T)->data=input;
//printf("%d",input);
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return OK;
}
Status PreOrderTraverse(BiTree T)
{
//先序遍歷二叉樹T的遞歸算法
if (T)
{
printf("%d ",T->data);
if(T->lchild) PreOrderTraverse(T->lchild);
if(T->rchild) PreOrderTraverse(T->rchild);
return FALSE;
}
elsereturn OK;
}
Status PreOrder(BiTree T)
{
//先序遍歷二叉樹T的非遞歸算法
while(!(T==NULL&&top==NULL))
{
if(T)
{
printf("%d ",T->data);
push(T);
T=T->lchild;
}
else
{
T=(BiTree)pop();
T=T->rchild;
}
}
}
Status InOrderTraverse(BiTree T)
{
//中序遍歷二叉樹T的遞歸算法
if (T)
{
if (T->lchild)......余下全文>>
但是,遞歸本質上也是壓棧,只不過是程序壓棧,還不如這個效率高 如果先序遍歷的非遞歸算法還有其他版本,這個版本是最好記的 不過理解就是另