二叉树的中序遍历算法

一,简介

二叉树的中序遍历在计算机行业有着重要的作用,其中一个应用就是判断一棵二叉树是否二叉排序树。

下面介绍递归和非递归两种方式实现中序遍历。

二,递归实现

递归实现非常简单,左根右依次进行即可。

void mid_scan2(node* now)
{
    if(now->left != NULL)
        mid_scan2(now->left);
    cout<num<<",";
    if(now->right != NULL)
        mid_scan2(now->right);
}

三,非递归实现

约定:

如果当前二叉树的某个结点没有左(右)孩子,那么该结点的左(右)孩子为NULL。

指针指向的结点,被称为当前结点。

1,实现思路

(1)如果根节点为空,则退出函数,否则将当前指针指向根节点,并进行以下的步骤:

(2)如果当前结点非空,将当前元素压栈,指针向左孩子。循环该步骤直至指针指空。

(3)如果当前指针指空,则:

                a,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

                b,判断当前结点的右子树是否为空。

                       b(1) 如果非空,则指针指向当前结点的右孩子,跳转到步骤(2)

                        b(2)如果为空,退栈,将指针指向退栈出来的元素,输出这个元素的数据。

                                   b(2-2)让指针指向当前结点右子树根结点。

(4)重复执行以上操作。

2,具体代码

#include
#include
#include
#include
using namespace std;
typedef struct node0{ 
	int num;
	node0* left;
	node0* right;
}node;

void layer_scan(node* head,int n)//层次遍历 ,用来验证二叉排序树的生成是否成功 
{
	cout<<"层次遍历的结果:"<=0)
	{
		while(now != NULL)//当前指针非空,那么就入栈,向左子树前进 
		{
			stack[top++] = *now;
			now = now->left;
		}
		top--;
		if(top<0)return result;
		now = &stack[top] ;//出栈,并让当前指针指向出栈的元素 
		cout<num<<",";
		result[top2++] = now->num;
		if(now->right != NULL)//右子树非空就往右前进一步,然后continue 
		{
			now = now->right;
			continue;
		}
		else
		{
			top--;
			if(top<0)return result;
			now = &stack[top] ;
			cout<num<<",";
			result[top2++] = now->num;
			now = now->right;
		}
	}
	return result;
}
void mid_scan2(node* now)//中序递归遍历算法 
{
	if(now->left != NULL)
		mid_scan2(now->left);
	cout<num<<",";
	if(now->right != NULL)
		mid_scan2(now->right);
}
node* BST_tree(int n)//建立一颗二叉排序树,该二叉树的结点个数为n,结点的值是随机的.
{//中序遍历二叉排序树的结果序列是一个有序序列,该函数最后返回该二叉排序树的根结点指针 
	node* head;//根结点指针 
	node* now; 
	int i,num;
	
	srand(time(0));//随机改变下面的随机种子 
	for(i=0;inum = num;
		//cout<left = NULL;
			head->right = NULL;
		}
		now = head;
		while(now->left!=NULL || now->right!=NULL)//未到达叶子结点时 
		{
			if(p->num > now->num)
			{
				if(now->right == NULL)break;
				now = now->right;
			}
			else 
			{
				if(now->left == NULL)break;
				now = now->left;
			}
		}
		if(p->num > now->num)//该if-else语句用来实现新结点在当前叶子结点的插入 
			now->right = p;
		else 
			now->left  = p;
		p->left = NULL;
		p->right = NULL;
	}
	cout<

运行结果:

二叉树的中序遍历算法_第1张图片

如有错误,敬请指正,礼貌交流,感激不尽 

你可能感兴趣的:(算法,数据结构)