二叉树的生成个遍历算法c语言,C语言实现二叉树遍历的迭代算法

本文实例讲述了C语言实现二叉树遍历的迭代算法,是数据结构算法中非常经典的一类算法。分享给大家供大家参考。

具体实现方法如下:

二叉树中序遍历的迭代算法:

#include

#include

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 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 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 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 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);

}

关于前序遍历,后来又写的算法如下,供大家参考:

void preOrderIterator(Node *root)

{

if (root == NULL)

return;

stack 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程序算法设计的学习有一定的借鉴价值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值