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

2021-09-26 20:14:30 字數 3122 閱讀 8301

後序的非遞迴主要利用了棧和乙個判斷指標,下次再來填坑

#include #include #include using namespace std;

#define maxsize 100

typedef struct bitnode bitnode,*bitree;

//定義乙個棧 用於後序遍歷查詢x的所有祖先

typedef struct stack ;

bitree creatbintree();

//序輸出函式

void preorder(bitree t);

void inorder(bitree t);

void postorder1(bitree t);

void postorder2(bitree t);

void levelorder(bitree t);

void preorder1(bitree t);

//雙分支節點個數函式

int dsonnode1(bitree t);

int dsonnode2(bitree t);

//交換左右子樹

void swap(bitree t);

//找出先序遍歷中第k個節點的值

int prenodek1(bitree t, int k);

int prenodek2(bitree t, int k);

//void searchx(bitree bt, int x);

//建樹 前中後序

int main()

//找出值為x的所有祖先

void searchx(bitree bt, int x)

if ( bt && bt->data == x)

exit(1); // 這句必須 用於斷開

}while (top != 0 && s[top].tag == 1)

if (top != 0)

} cout << "很遺憾沒有在樹中找到"<< x << endl;

}//找出先序遍歷中第k個數字

int ptf = 1;//全域性變數 只用於以下這個函式

int prenodek1(bitree t, int k)

if (ptf == k)

ptf++;

int ch;

ch = prenodek1(t->left, k);

if (ch != '#')

ch = prenodek1(t->right, k);

return ch;

}int ppt = 0;

int prenodek2(bitree t, int k)

return prenodek2(t->left, k);

return prenodek2(t->right, k); }

}//交換左右子樹

void swap(bitree t) }/

//雙分支節點個數

int dsonnode1(bitree t)

else if (t->left && t->right)

else

}int dsonnode2(bitree t)

bitree p;

bitree q[100];//佇列陣列

int top = -1;

q[++top] = t;

int cnt = 0;

while (top != -1)

return cnt;}//

//排序

void postorder1(bitree t)

else

else

} }}void levelorder(bitree t) }}

void postorder2(bitree t)

}void preorder(bitree t)

}//先序非遞迴

void preorder1(bitree t)

}void inorder(bitree t)

}bitree creatbintree()

bt[0]->left = bt[1];

bt[0]->right = bt[2];

bt[1]->left = bt[3];

bt[1]->right = bt[5];

bt[2]->left = bt[6];

bt[2]->right = bt[8];

bt[3]->left = null;

bt[3]->right = null;

bt[4]->left = null;

bt[4]->right = null;

bt[5]->left = bt[4];

bt[5]->right = null;

bt[6]->left = null;

bt[6]->right = bt[7];

bt[7]->left = null;

bt[7]->right = null;

bt[8]->left = null;

bt[8]->right = null;

return bt[0];

}

執行結果:

前序遍歷 遞迴: 65 66 68 70 69 67 71 72 73

前序遍歷 非遞迴: 65 66 68 70 69 67 71 72 73

中序遍歷 遞迴: 68 66 69 70 65 71 72 67 73

後序的非遞迴才是重頭戲

後序遍歷 非遞迴: 68 69 70 66 72 71 73 67 65

後序遍歷 遞迴: 68 69 70 66 72 71 73 67 65

層序遍歷 非遞迴: 65 66 67 68 70 71 73 69 72

雙分支節點個數(課本**): 3

雙分支節點個數(自己寫的**): 3

交換左右子樹後前序遍歷 : 65 67 73 71 72 66 70 69 68

交換左右子樹後中序遍歷 : 73 67 72 71 65 70 69 66 68

找出先序遍歷中第6個節點的值 書本** 66

再次交換左右子樹

交換左右子樹後前序遍歷 : 65 66 68 70 69 67 71 72 73

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

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

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...