首页 > 其他 > 详细

数据结构----二叉树遍历的非递归版本(不用栈)

时间:2014-02-12 22:22:40      阅读:613      评论:0      收藏:0      [点我收藏+]

二叉树遍历的非递归版本除了可以使用 stack 外, 见 http://blog.csdn.net/shoulinjun/article/details/19089155

还可以采用 parent 指针和标记来实现。

二叉树节点的数据结构如下:

/**
* struct TreeNode 
* {
*   char value; 
*   TreeNode *parent;
*   TreeNode *left_child;
*   TreeNode *right_child;
*   bool visited; //标记是否已访问
* };
*/

前序遍历:

void PreOrderVisitNoStack(TreeNode * root)//非递归,不用栈
{
  while(root != NULL)
  {
	if(!root->visited){
      cout << root->value << " ";
	  root->visited = true;
	}
    while(root->left_child && !root->left_child->visited)
	{
	  root = root->left_child;
      cout << root->value << " ";
	  root->visited = true;
	}
	if(root->right_child !=NULL && !root->right_child->visited)
	{
	  root = root->right_child;
	}
	else
	  root = root->parent;
  }
}

中序遍历:

void InOrderVisitNoStack(TreeNode * root)
{
  while(root != NULL)
  {
    while(root->left_child && !root->left_child->visited)
	{
	  root = root->left_child;
	}
	if(!root->visited)
	{
	  cout << root->value << " ";
	  root->visited = true;
	}
	if(root->right_child !=NULL && !root->right_child->visited)
	{
	  root = root->right_child;
	}
	else
	  root = root->parent;
  }
}

后序遍历:

void PostOrderVisitNoStack(TreeNode *root)
{
  while(root)
  {
    while(root->left_child && !root->left_child->visited){
	  root = root->left_child;
	}
	//右子树未访问
    if(root->right_child && !root->right_child->visited){
	  root = root->right_child;
	}
	else{
	  cout << root->value << " ";
	  root->visited = true;
	  root = root->parent;
	}
  }
}


数据结构----二叉树遍历的非递归版本(不用栈)

原文:http://blog.csdn.net/shoulinjun/article/details/19113367

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!