- 浏览: 741322 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (439)
- 生活小感 (9)
- Java (65)
- 笔面经 (18)
- 算法 (45)
- 读书笔记 (1)
- Android (147)
- 设计模式 (7)
- C语言 (7)
- 职业生涯 (6)
- 网络 (5)
- 数据库 (3)
- Linux/Unix (21)
- C++ (7)
- 思考 (3)
- WinPhone (4)
- Git (6)
- http (1)
- UML (1)
- SQL (2)
- Ant (1)
- iOS (14)
- FFmpeg (22)
- WebRTC (10)
- Mac (2)
- web (0)
- TCP (2)
- Vim (2)
- OpenSSL (1)
- OpenGL (6)
- 多媒体 (10)
- cocos2d (2)
- svn (1)
最新评论
-
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
WebSocket初探【转】 -
ding335306:
这个目录下没有找到此文件
eclipse.ini in MAC -
songshuaiyang:
哥们写东西可真乱啊
Android获取cpu和内存信息、网址的代码 -
zhoutao_temp:
这是自己能看懂还是让别人能看得懂,您就不能把版面稍微整理一下吗 ...
FFMPEG源码分析 -
chriszeng87:
string2020 写道git clone --bare表示 ...
复制git库
有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针。
要求不用递归,中序遍历这棵树。另要求空间复杂度是O(1).
空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所以想了想思路,也请教过好几个朋友,大家都基本想法都差不多,由于有指向父节点的指针,必定可以回溯,从而可以不需要堆栈来做记录.
- /*思路:
- 关于终止条件:中序遍历终止于最后的rchild,只能先遍历一遍,将该节点作为终止条件。
- 对遍历时候的 cur节点设置一个状态(0,1,2)
- 0标识其左,右节点情况尚未处理
- 1标识其左节点被处理(包括左节点不存在的情况)
- 2标识从右节点返回(包括右节点不存在的情况)
- 3种状态的判断用(post->parent->lchild == post)这样的方法判断。
- */
- void inorder_norecursive(LinkTree *root)
- {
- LinkTree * cur=root, * post, *fin;
- int cur_state = 0;
- while(cur != NULL) //查找终止条件
- {
- post = cur;
- cur = cur->rchild;
- }
- fin = post;
- cur = root;
- post = NULL;
- printf("fin data :%d /n",fin->data);
- while( !(cur == fin && cur_state >=1) )
- {
- while(cur != NULL && cur->lchild != NULL && cur_state != 2) //搜索:每次遍历,当前状态清零,找到可以打印的点,从右节点返回不应该继续向下遍历
- {
- cur_state = 0;
- cur = cur->lchild;
- }
- if( (cur == NULL && cur_state == 1) || cur_state == 2) //返回:右节点为空,返回的情况或者从右节点返回
- {
- cur = post;
- if(cur->parent->lchild == cur)
- cur_state = 1;
- else if(cur->parent->rchild == cur)
- cur_state = 2;
- cur = cur->parent;
- }
- if( cur->lchild == NULL && cur_state == 0)
- cur_state = 1;
- post = cur; //post针对cur遍历到NULL时候返回,记录有效节点
- if( cur_state == 1) //中序打印
- {
- printf(" %d ",cur->data);
- if(cur == fin) //打印最后一个,显式退出
- break;
- }
- else if(cur_state == 2) //节点的2个子节点已被处理,向上返回
- continue;
- if(cur->rchild == fin) //如果是fin节点的父节点,提前设置cur_state状态,防止while退出
- cur_state = 0;
- cur = cur->rchild;
- }
- }
转自: http://blog.csdn.net/hairetz/article/details/5069128
// 中序遍历伪代码:非递归版本,不用栈,增加指向父节点的指针
中序遍历的第二个非递归版本:采用指向父节点的指针回溯。这个与先序遍历是非常类似的,不同之处在于,先序遍历只要一遇到节点,那么没有被访问那么立即访问,访问完毕后尝试向左走,如果左孩子补课访问,则尝试右边走,如果左右皆不可访问,则回溯;中序遍历是先尝试向左走,一直到左边不通后访问当前节点,然后尝试向右走,右边不通,则回溯。(这里不通的意思是:节点不为空,且没有被访问
- void InOrder3(TNode* root)
- {
- while ( root != NULL ) // 回溯到根节点时为NULL,退出
- {
- while ( root->left != NULL && !root->left->bVisited )
- { // 沿左子树向下搜索当前子树尚未访问的最左节点
- root = root->left;
- }
- if ( !root->bVisited )
- { // 访问尚未访问的最左节点
- Visit(root);
- root->bVisited=true;
- }
- if ( root->right != NULL && !root->right->bVisited )
- { // 遍历当前节点的右子树
- root = root->right;
- }
- else
- { // 回溯至父节点
- root = root->parent;
- }
- }
- }
这一部分转自:http://blog.csdn.net/kofsky/article/details/2886453
发表评论
-
leetcode之 median of two sorted arrays
2015-07-30 00:08 785另一种方法即是利用类似merge的操作找到中位数,利用两个分 ... -
LeetCode – Min Stack
2015-06-11 18:27 642转自:http://www.programcreek.com ... -
二叉树中所有节点的左右子树相互交换 递归与非递归程序
2015-06-11 14:18 3127//将二叉树中所有节点的左右子树相互交换 转自:http: ... -
Word Break II
2015-06-09 23:38 680转自:http://www.acmerblog.com/ ... -
最大子序列和问题
2015-06-08 09:10 753问题描述: 输入一组整数,求出这组数字子序列和 ... -
判断是否二叉搜索树
2015-05-31 16:49 904转自:http://blog.163.com/yichan ... -
LeetCode | Decode Ways
2015-05-28 22:09 659题目: A message containing le ... -
A* Pathfinding for Beginners
2014-11-01 10:40 697转自:http://www.policyalmanac.o ... -
P问题、NP问题和NP完全问题
2014-10-28 23:47 23241、P问题 P是一个判定 ... -
外部排序技术之多路归并
2014-10-19 11:32 979转自:http://blog.chinaunix.net/u ... -
利用动态规划求连续数组最大和以及最大子矩阵的和
2014-09-11 09:14 2004题目一: 给定一个整型数组,数组中有正有负,求最大连续子序 ... -
一些算法刷题的网站
2014-09-04 22:31 38671. leetcode http://leetcode ... -
[leetcode] A Distance Maximizing Problem的疑问
2014-08-25 22:38 1516http://leetcode.com/2011/05/a- ... -
二叉树中两个结点的最近公共祖先
2014-08-03 11:30 564Node* findComAncestor(No ... -
单链表原地逆置递归与非递归解法
2014-07-24 23:48 1173#include <stdio.h> t ... -
Google面试题:赛马问题
2013-07-10 23:52 2142转自: http://coolshell.c ... -
《单链表的环的入口点一个小证明》
2013-06-16 23:14 1435http://blog.csdn.net/learniti ... -
[转]稳定排序和不稳定排序
2013-04-21 12:11 916首先,排序算法的稳定 ... -
最大子矩阵和问题
2011-10-06 23:20 2907最大子矩阵问题:问题描述:(具体见http://acm ... -
EMC面试题
2011-10-02 22:29 14731.一个未排序整数数组 ...
相关推荐
二叉树的非递归中序遍历 C 代码 一、数据结构:二叉树 在计算机科学中,二叉树是一种重要的数据结构。它是一种树形结构,其中每个节点最多有两个子节点,即左子节点和右子节点。二叉树广泛应用于计算机科学和软件...
### 中序遍历二叉树非递归算法详解 #### 1. 理解中序遍历的基本概念 中序遍历是一种按照左子树、根节点、右子树的顺序访问二叉树所有节点的过程。对于每个节点,先遍历其左子树,然后访问该节点本身,最后遍历其右...
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
无栈非递归中序遍历二叉树,不用辅助栈,允许改变LLING和RLINK的值
非递归中序遍历二叉树
数据结构课程实验代码,采用非递归,通过自己建立二叉树,完成中序遍历
非递归中序遍历使用一个辅助堆栈来避免函数调用的开销。其基本步骤如下: 1. 初始化一个空堆栈,设置当前节点为根节点。 2. 当当前节点不为空或堆栈未空时,循环执行以下操作: a. 如果当前节点不为空,将其压入...
//二叉树的二叉链表存储表示 typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTree; typedef struct { BiTree *base; BiTree *top; int stacksize; //当前...
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
### C语言实现二叉树的中序遍历(非递归) #### 背景介绍 在计算机科学中,二叉树是一种常见的数据结构,在算法设计与分析领域扮演着极其重要的角色。对于二叉树的操作主要包括查找、插入、删除以及各种形式的遍历...
二叉树的建立及递归中序遍历,非递归中序遍历及赫夫曼编码 输入二叉树时前面要带空指针
非递归中序遍历是一种在不使用递归方法的情况下遍历二叉树的策略,主要依赖于数据结构栈来实现。在这个Java代码示例中,我们看到的是如何使用栈来执行非递归中序遍历的过程。首先,让我们详细了解二叉树和中序遍历的...
在非递归实现中,我们通常使用一个栈来帮助完成这一过程: ```c void PreOrderUnrec(Bitree *t) { Stack s; StackInit(s); Bitree *p = t; while (p != NULL || !StackEmpty(s)) { while (p != NULL) { // ...
用递归先序算法建立二叉树。要求通过键盘输入二叉树的先序遍历顺序从而建立一棵二叉树。利用栈实现一棵二叉树的中序非递归遍历。要求显示遍历次序。
在计算机科学领域,二叉树是一种重要的数据结构,它由一系列节点组成,每个节点...总之,递归中序遍历是理解二叉树结构及其遍历策略的关键所在,掌握这一技术对任何从事软件开发或数据结构研究的人来说都是至关重要的。
这个非递归中序遍历算法可以有效地遍历任何类型的二叉树,只要它的节点值是模板类支持的类型。在实际应用中,我们可以通过构造不同类型的二叉树,例如整数二叉树、字符二叉树等,来测试和验证这个遍历算法的正确性。...
利用栈的基本操作实现二叉树的中序遍历非递归算法。
在C语言中,一个简单的递归中序遍历函数可能如下: ```c void inorderTraversal(struct TreeNode* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal...
非递归中序遍历是二叉树遍历的一种常见方法,主要应用于数据结构和算法的学习与实践。在非递归实现中序遍历时,我们通常利用栈来辅助完成这一过程,因为它能有效地控制访问顺序,同时避免了递归带来的额外开销。以下...
包含一下方法: 1.通过一个数组来构造一颗二叉树 2.通过一个数组来构造一颗...7.使用非递归 中序遍历一棵二叉树 8.使用非递归 后序遍历一棵二叉树 PS:代码为C++代码 可以直接下载使用!!! PS2:每句代码都有详细注释