算法习题43:递归和非递归实现二叉树的前序遍历
来源:互联网 发布:西北师大知行学院在哪 编辑:程序博客网 时间:2024/06/04 18:12
.递归和非递归俩种方法实现二叉树的前序遍历。
------------------------------------------------
递归的替换我们很容易就想到,肯定是借助循环,可是我们这里递归二叉树的时候其实是借助编译器内部的栈来实现存储打印的,从而具有记忆功能,
而现在如果只用循环,这种记忆功能将不存在,所以我们需要利用一个辅助队列来实现
那么这个过程就简单多了,比如下面一棵树
9
6 11
3 8 10 15
1 7
2
我们先往队列(就是一个链表结构)里放入根元素
然后遍历左右子树有则加入
9 6 11
接下来遍历6,左右子树加入
9 6 3 8 11
然后遍历3.以此类推 结果就出来了 打印队列
同理,如果要中序遍历呢?这里需要在LinkNode这个结构体里加入一个变量,表示是否已经被访问过,这个大家可以考虑下,只是这个时候节点加入是在节点左右加入 先加入左子树,再加入自己,然后才是右子树
例如上例子
先访问根9,则链表成: 6 9(标记以被访问) 11
然后访问6,则链表成: 3 6 8 9 11
访问3,则 1 3 6 8 9 11
访问1,则 1 2 3 6 8 9 11
访问2,则 1 2 3 6 8 9 11
访问8,则 1 2 3 6 7 8 9 11.。。
以此类推结果同上
//============================================================================// Name : BTreeMLR.cpp// Author : YLF// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>using namespace std;struct Node{int value;Node* left;Node* right;};struct LinkNode{Node* node;LinkNode* next;};class BTree{private:Node* root;void Add(Node* &p, int value){if(p == NULL){Node* temp = new Node();temp->value = value;temp->left = NULL;temp->right = NULL;p = temp;return ;}if(value < p->value)Add(p->left, value);else if(value > p->value)Add(p->right, value);}void MLR(Node* p){if(p == NULL)return;cout<<p->value<<" ";MLR(p->left);MLR(p->right);}public:BTree(){root = NULL;}void Add(int value){Add(root, value);}void MLR(){MLR(root);}void MLR2(){//用一个链表记录左右子树实现Node* child = root;if(root == NULL)return;LinkNode* head = new LinkNode();head->node = root;head->next = NULL;LinkNode* current = head;while(current != NULL){LinkNode* p = current;LinkNode* temp = current->next;child = current->node;if(child->left != NULL){LinkNode* newNode = new LinkNode();newNode->next = NULL;newNode->node = child->left;p->next = newNode;p = p->next;}if(child->right != NULL){LinkNode* newNode = new LinkNode();newNode->next = NULL;newNode->node = child->right;p->next = newNode;p = p->next;}p->next = temp;current = current->next;}while(head != NULL){cout<<head->node->value<<" ";head = head->next;}}};int main() {BTree* bTree = new BTree();int input = 0;while(true){cin>>input;if(input!=-1)bTree->Add(input);else break;}bTree->MLR();cout<<endl;bTree->MLR2();return 0;}
9 6 11 10 15 3 8 1 7 2 -19 6 3 1 2 8 7 11 10 15 9 6 3 1 2 8 7 11 10 15
- 算法习题43:递归和非递归实现二叉树的前序遍历
- 【LintCode-66】二叉树的前序遍历(Java实现-递归算法/非递归算法)
- 【算法题】二叉树的前序遍历(递归和非递归算法分析)
- 【二叉树遍历算法】——前/中/后序递归与非递归的实现
- [算法]二叉树的非递归前序遍历算法
- 二叉树的遍历(前序,中序,后序,层序)--递归和非递归算法实现
- 二叉查找树的概念以及实现 前序、中序和后序递归非递归遍历算法
- 以二叉树的前序遍历为例,递归和非递归方式的实现
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 43.递归和非递归俩种方法实现二叉树的前序遍历。
- 递归和非递归俩种方法实现二叉树的前序遍历
- 递归和非递归俩种方法实现二叉树的前序遍历
- 递归和非递归实现二叉树的前序遍历
- 请用递归和非递归俩种方法实现二叉树的前序遍历。
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- 二叉树的前序遍历---非递归实现
- 二叉树的前序遍历(递归+非递归)
- 用java实现二叉树非递归的前序,中序,后序遍历算法
- 代理服务器学习日志(二)
- Node.js 博客文章推荐node.js 初体验
- Android中实现上下左右都可滑动的ScrollView
- Android Studio 升级导致新工程创建失败的问题解决
- cocos2d-x中矩形的碰撞检测
- 算法习题43:递归和非递归实现二叉树的前序遍历
- Android下如何理解onMeasure,onLayout的过程
- 从这里起步
- 用ViewGroup实现左右滚动
- iOS-os 各种工具快到碗里来(转自cocoa china )
- mysql再次安装出现的问题解决方案
- asp.net如何实现像QQ空间日志的置顶功能!用得是sql+asp.net(调用存储过程)
- css3中的@font-face制作图标字体icofont
- WPS (Word Processing System)