非遞迴遍歷二叉樹

2021-05-22 21:36:28 字數 2271 閱讀 4247

// 中序遞迴遍歷

void inordertrvdigui(node* pnode)

}

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

非遞迴遍歷二叉樹模擬遞迴呼叫時程式位址的壓棧、出棧操作,必須引入乙個stack儲存結點位址。它的程式執行開銷大大低於遞迴遍歷演算法。

下面列舉出三種非遞迴遍歷二叉樹演算法**。

// **經過除錯成功

#include

#include

#include

#include

using namespace std;

typedef struct tagnodenode;

typedef struct tagtreetree;

// 初始化樹

void inittree(tree* ptree)



 ptree->prootnode = pnode[11];

 pnode[11]->leftnode = pnode[7];

 pnode[11]->rightnode = pnode[16];

 pnode[7]->leftnode = pnode[3];

 pnode[7]->rightnode = pnode[9];

 pnode[3]->leftnode = pnode[0];

 pnode[3]->rightnode = pnode[5];

 pnode[0]->rightnode = pnode[2];

 pnode[2]->leftnode = pnode[1];

 pnode[5]->leftnode = pnode[4];

 pnode[5]->rightnode = pnode[6];

 pnode[9]->leftnode = pnode[8];

 pnode[9]->rightnode = pnode[10];

 pnode[16]->leftnode = pnode[14];

 pnode[16]->rightnode = pnode[19];

 pnode[14]->leftnode = pnode[12];

 pnode[12]->rightnode = pnode[13];

 pnode[14]->rightnode = pnode[15];

 pnode[19]->leftnode = pnode[17];

 pnode[17]->rightnode = pnode[18];

 pnode[19]->rightnode = pnode[21];

 pnode[21]->leftnode = pnode[20];

 pnode[21]->rightnode = pnode[23];

 pnode[23]->leftnode = pnode[22];

}

// 先序非遞迴遍歷

void preordertrv(node* prootnode)

 else

  }

}

// 中序非遞迴遍歷

void inordertrv(node* prootnode)

 else

  }

}

// 中序遞迴遍歷

void inordertrvdigui(node* pnode)

}

// 後序非遞迴遍歷

void postordertrv(node* prootnode)

 //get the top element of the stack

 pnode = nodeptrstack.top();

 //如果p沒有右孩子或者其右孩子剛剛被訪問過

 if(pnode->rightnode == null || pnode->rightnode == pre)

  else

  }

}

int _tmain(int argc, _tchar* argv)



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

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

二叉樹非遞迴遍歷

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

二叉樹非遞迴遍歷

1.先序遍歷 從遞迴說起 void preorder tnode root 遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場...