C語言實現(xiàn)二叉樹遍歷的迭代算法
本文實例講述了C語言實現(xiàn)二叉樹遍歷的迭代算法,是數(shù)據(jù)結(jié)構(gòu)算法中非常經(jīng)典的一類算法。分享給大家供大家參考。
具體實現(xiàn)方法如下:
二叉樹中序遍歷的迭代算法:
#include <iostream>
#include <stack>
using namespace std;
struct Node {
Node(int i, Node* l = NULL, Node* r = NULL) : item(i), left(l), right(r) {}
int item;
Node* left;
Node* right;
};
Node* construct() {
Node* node6 = new Node(16);
Node* node5 = new Node(12);
Node* node4 = new Node(8);
Node* node3 = new Node(4);
Node* node2 = new Node(14, node5, node6);
Node* node1 = new Node(6, node3, node4);
Node* node0 = new Node(10, node1, node2);
return node0;
}
//遞歸算法
void inorder(Node *root)
{
if (root == NULL)
return;
inorder(root->left);
cout << root->item << " ";
inorder(root->right);
}
void preorder(Node *root)
{
if(root == NULL)
return;
cout << root->item << " ";
preorder(root->left);
preorder(root->right);
}
void postorder(Node *root)
{
if (root == NULL)
return;
postorder(root->left);
postorder(root->right);
cout << root->item << " ";
}
void postorder2(Node *root)
{
if (root == NULL)
return;
stack<Node *> nstack;
Node *pre = NULL;
nstack.push(root);
Node *node = NULL;
while (!nstack.empty())
{
node = nstack.top();
if (pre != node->left && pre != node->right)
{
if (node->right)
nstack.push(node->right);
if (node->left)
nstack.push(node->left);
}
if (node->left == NULL && node->right == NULL
|| pre == node->left || pre == node->right)
{
cout << node->item << " ";
nstack.pop();
}
pre = node;
}
}
void preorder2(Node *root)
{
if(root == NULL)
return;
stack<Node *> nstack;
Node *node = root;
while (node != NULL || !nstack.empty())
{
while(node != NULL)
{
cout << node->item << " ";
nstack.push(node);
node = node->left;
}
node = nstack.top();
nstack.pop();
node = node->right;
}
}
void preorder3(Node *root)
{
if (root == NULL)
return;
stack<Node *> nstack;
nstack.push(root);
Node *node = NULL;
while (!nstack.empty())
{
node = nstack.top();
nstack.pop();
cout << node->item << " ";
if (node->right)
nstack.push(node->right);
if (node->left)
nstack.push(node->left);
}
}
//迭代算法
void inorder2(Node *root)
{
if(root == NULL)
return;
stack<Node *> nstack;
nstack.push(root);
Node *next = root->left;
while (next != NULL || !nstack.empty())
{
while (next != NULL)
{
nstack.push(next);
next = next->left;
}
next = nstack.top();
nstack.pop();
cout << next->item << " ";
next = next->right;
}
}
int main()
{
Node *root = construct();
cout << "---------中序遍歷遞歸---------" << endl;
inorder(root);
cout << endl;
cout << "---------中序遍歷迭代---------" << endl;
inorder2(root);
cout << endl;
cout << "---------先序遍歷遞歸---------" << endl;
preorder(root);
cout << endl;
cout << "---------先序遍歷迭代1---------" << endl;
preorder2(root);
cout << endl;
cout << "---------先序遍歷迭代2---------" << endl;
preorder3(root);
cout << endl;
cout << "---------后序遍歷遞歸---------" << endl;
postorder(root);
cout << endl;
cout << "---------后序遍歷迭代---------" << endl;
postorder2(root);
}
關(guān)于前序遍歷,后來又寫的算法如下,供大家參考:
void preOrderIterator(Node *root)
{
if (root == NULL)
return;
stack<Node*> nstack;
nstack.push(root);
while (!nstack.empty())
{
Node *top = nstack.top();
while (top != NULL)
{
if (top->left)
nstack.push(top->left);
cout << top->data << " ";
top = top->left;
}
while (top == NULL && !nstack.empty())
{
top = nstack.top()->right;
nstack.pop();
}
if (top != NULL)
nstack.push(top);
}
}
相信本文所述對大家C程序算法設(shè)計的學(xué)習(xí)有一定的借鑒價值。
相關(guān)文章
visual?studio?2022?編譯出來的文件被刪除并監(jiān)視目錄中的文件變更(示例詳解)
這篇文章主要介紹了visual?studio?2022?編譯出來的文件被刪除?并監(jiān)視目錄中的文件變更,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
solaris操作系統(tǒng)做c應(yīng)用程序開發(fā)步驟
solaris操作系統(tǒng)做c應(yīng)用程序開發(fā)步驟,大家參考使用吧2013-12-12
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解2013-05-05
C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)
鏈表是線性表的鏈?zhǔn)酱鎯Ψ绞?。鏈表的?nèi)存是不連續(xù)的,前一個元素存儲地址的下一個地址中存儲的不一定是下一個元素。小編今天就將帶大家深入了解一下鏈表,快來學(xué)習(xí)吧2021-12-12

