二叉树(2)----中序遍历,递归和非递归实现
2014-12-14 19:57
232 查看
1、二叉树定义:
2、中序遍历
定义:首先访问左子树,然后访问根节点,最后访问右子树
(1)递归实现
如果根节点为NULL,则返回
如果根节点不为NULL,则首先访问左子树,然后访问根节点,最后访问右子树
(2)非递归实现
第一步:给定根节点pRoot,判断pRoot是否为空,如果不为空,然后进行第二步;如果为空,则进行第三步;
第二步:将pRoot入栈,将pRoot的左结点赋给pRoot,然后进行第一步;
第三步:判断栈是否为空;如果为空,则结束,如果不为空,则取出栈顶元素给pRoot,并出栈,访问pRoot,然后将pRoot的右结点赋给pRoot,然后进行第一步。
typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t;
2、中序遍历
定义:首先访问左子树,然后访问根节点,最后访问右子树
(1)递归实现
如果根节点为NULL,则返回
如果根节点不为NULL,则首先访问左子树,然后访问根节点,最后访问右子树
void InorderTraverse( BTreeNode_t *pRoot){ if( pRoot == NULL ) return ; InorderTraverse( pRoot->m_pLeft); Visiste( pRoot ); InorderTraverse( pRoot->m_pRight); }
(2)非递归实现
第一步:给定根节点pRoot,判断pRoot是否为空,如果不为空,然后进行第二步;如果为空,则进行第三步;
第二步:将pRoot入栈,将pRoot的左结点赋给pRoot,然后进行第一步;
第三步:判断栈是否为空;如果为空,则结束,如果不为空,则取出栈顶元素给pRoot,并出栈,访问pRoot,然后将pRoot的右结点赋给pRoot,然后进行第一步。
void InorderTraverse( BTreeNode_t *pRoot){ if( pRoot == NULL ) return ; stack < BTreeNode_t *> st; while( pRoot != NULL || !st.empty() ){ while( pRoot != NULL ){ st.push( pRoot); pRoot = pRoot->m_pLeft; } if( !st.empty() ){ pRoot = st.top(); st.pop(); Visit( pRoot ); pRoot = pRoot->m_pRight; } } return; }
相关文章推荐
- 算法导论第十章习题10.4-3非递归方式实现二叉树的中序遍历
- 14.二叉树 中序遍历 先序遍历 的非递归实现 以及 二叉树 的复制 及判断二叉树的等价性
- 二叉树之中序遍历的递归和迭代实现
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 利用非递归方法实现二叉树的中序遍历
- 二叉树先序遍历,中序遍历和后序遍历的非递归实现
- 二叉树的中序遍历、递归实现、非递归实现、层次遍历、二叉树的应用,来来来,都有都有
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树的非递归实现中序遍历
- Binary Tree Inorder Traversal-非递归实现中序遍历二叉树
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 二叉树的先序遍历、中序遍历、后序遍历、层次遍历的递归实现
- 递归实现和非递归实现中序遍历二叉树
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- 试编写一个函数,返回一颗给定二叉树在中序遍历下的最后一个节点(分别用递归和非递归实现)
- 二叉树前后中序遍历的非递归实现
- 二叉树基础之前序遍历、中序遍历、后序遍历的递归和非递归实现
- 先序遍历、中序遍历二叉树非递归实现
- 二叉树的实现&&递归和非递归方式前序、中序、后续遍历&&发现一个节点中序遍历的下一节点