後序的非遞迴主要利用了棧和乙個判斷指標,下次再來填坑
#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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...