a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言實現二叉樹遍歷的迭代算法

2020-01-26 15:18:23
字體:
來源:轉載
供稿:網友

本文實例講述了C語言實現二叉樹遍歷的迭代算法,是數據結構算法中非常經典的一類算法。分享給大家供大家參考。

具體實現方法如下:

二叉樹中序遍歷的迭代算法:

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

關于前序遍歷,后來又寫的算法如下,供大家參考:

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程序算法設計的學習有一定的借鑒價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美亚洲免费 | 成人国产在线观看 | 久久久久久高潮国产精品视 | 99精品国产在热久久 | 国产精品毛片久久久久久久 | 日本免费不卡 | 一区二区日韩精品 | 日本久久久一区二区三区 | 日韩一区精品视频 | 日韩在线视频网站 | 99国内精品久久久久久久 | 美日韩在线 | 超碰国产在线 | 欧美精品三级 | 国产精品三级在线 | 精久久久 | 精品96久久久久久中文字幕无 | 精品九九 | 亚洲男人的天堂网站 | 中文日韩| 久久高潮| 91在线免费看 | 久久免费精品 | 97超碰自拍 | 97国产在线 | 日韩精品免费在线观看 | 久久久久久久久一区二区 | 久久色av | 日韩一区二区三区在线观看 | 日本a在线 | 午夜看片在线观看 | 国产高清不卡一区二区三区 | 日韩不卡 | 永久黄网站色视频免费观看w | 日本在线一区二区 | 国产一二三区不卡 | 青青草国产 | 99久久99久久免费精品蜜臀 | 欧美在线网站 | 国产一区二区三区免费在线 | xx视频在线观看 |