二叉树的遍历方式

二叉树的遍历方式这里介绍三种:中序遍历(左根右),前序遍历(根左右),后序遍历(左右根),三者的遍历顺序不同,但是遍历的思想是相同的,都灵活地运用了递归

1.1中序遍历(左根右)

如上图,遍历上述二叉树,用中序遍历方法,则得到的遍历结果为:NULL, D, NULL, B, NULL, A, NULL, E, NULL, C, NULL, F, NULL,因为中序遍历的遍历顺序是左根右,严格按照这个顺序来遍历,并且运用了递归的方法,代码如下:

1.1.1结构的定义链式二叉树
typedef char BTDataType;//定义数据结构类型
typedef struct BinaryTreeNode
{
   BTDatatype data;
   struct BinaryTreeNode* left;
   struct BinaryTreeNode* right;
}BTNode;
1.1.2中序遍历—左根右
void inOrder(BTNode* root)
{
   if(root == NULL)//当然也可以用assert来断言
   {
      printf("NULL");
      return;
   }
   inOrder(root->left);//不断地向下寻找左结点
   printf("%c",root->data);//打印结点
   inOrder(root->right);//寻找右结点
}

这里运用了递归的思想,不断地向下寻找所需要的结点,如果遇到空结点,则返回,每次调用函数就会创建一个函数栈桢,函数运行完毕,则消除该函数栈桢。

1.1.3测试该函数的执行

BTNode* buyNode(char x)//创建一个函数用来创造结点
{
    BTNode* node = (BTNode*)malloc(sizeof(BTNode))
    node->data = x;
    node->left = node->right = NULL;
    return node;
}

BTNode* createBinaryTree()//创建原始的数据
{
    BTNode* nodeA = buyNode('A');
	BTNode* nodeB = buyNode('B');
	BTNode* nodeC = buyNode('C');
	BTNode* nodeD = buyNode('D');
	BTNode* nodeE = buyNode('E');
	BTNode* nodeF = buyNode('F');

	nodeA->left = nodeB;
	nodeA->right = nodeC;
	nodeB->left = nodeD;
	nodeC->left = nodeE;
	nodeC->right = nodeF;

	return nodeA;
}

int main()
{
    BTNode* root = createBinaryTree();
    inOrder(root);
    return 0;
}

通过以上代码就可以实现中序遍历啦

1.2前序遍历(根左右)

同理如上二叉树,用前序遍历可以的到的遍历结果为:A, B, D, NULL, NULL, NULL, C, E, NULL, NULL, F, NULL, NULL,因为前序遍历运用的思想是根左右,所以严格先遍历根结点,再到左和右结点,并且同时也用了递归,代码如下:

1.2.1结构的定义链式二叉树

结构的定义与中序遍历的一样

1.2.2前序遍历—根左右
void preOrder(BTNode* root)
{
    if(root == NULL)
    {
       printf("NULL");
       return;
    }
}
    printf("%c",root->data);
    preOrder(root->left);//递归
    preOrder(root->right);//递归
}

因为是先遍历根结点,所以会先打印出根结点的数据,在用递归的方式去寻找左右结点,同样,每调用一次函数就创建一个函数栈桢,结束后销毁。

1.2.3测试函数运行
int main()
{
    BTNode* root = createBinaryTree();
    preOrder(root);
    return 0;
}

将main函数里面调用的函数修改一下就好啦,这样就可以完成前序遍历啦(测试中其他和中序遍历是一样的代码)

1.3后序遍历(左右根)

同理如上图二叉树,遍历结果为:NULL, NULL, D, NULL, B, NULL, NULL, E, NULL, NULL, F, C, A,因为后序遍历运用的思想是左右根,所以严格按照左结点到右结点,再根结点,并且同时也用了递归,代码如下:

1.3.1结构的定义链式二叉树

和中序遍历一样哈

1.3.2后序遍历—左右根
void postOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	postOrder(root->left);
	postOrder(root->right);
	printf("%c ", root->data);
}

这里运用了递归的思想,不断地向下寻找所需要的结点,如果遇到空结点,则返回,每次调用函数就会创建一个函数栈桢,函数运行完毕,则消除该函数栈桢。

1.3.3测试函数运行
int main()
{
    BTNode* root = createBinaryTree();
    postOrder(root);
    return 0;
}

将main函数里面调用的函数修改一下就好啦,这样就可以完成前序遍历啦(测试中其他和中序遍历是一样的代码)

总结:二叉树三种遍历方式思想都差不多,找到其中的递归思想就可以完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值