数据结构:二叉树:第1关:基于二叉链表的二叉树左右孩子的交换

任务描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子。

编程要求

输入

多组数据。每组数据一行,为二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出

每组数据输出一行。为交换左右孩子后的二叉树的先序序列。

测试说明

平台会对你编写的代码进行测试:

测试输入: abcd00e00f00ig00h00 abd00e00cf00g00 0

预期输出: aihgbfced acgfbed

来源

BJFUOJ


开始你的任务吧,祝你成功!

#include<iostream>
#include<cstring>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T,char S[],int &i)
{//先序建立二叉树
	if(S[i]=='0')
		T=NULL;
	else
	{
		T=new BiTNode;
		T->data=S[i];
		CreateBiTree(T->lchild,S,++i);
		CreateBiTree(T->rchild,S,++i);
	}
}
void ChangeRL(BiTree &T)
{//二叉树左右孩子的交换
/**************begin************/
  	//一、前置情报:每个叶子有data域和左右孩子的指针域。传入的T是建立好的二叉树
    //二、算法思路:创建中间指针tem用于交换左右孩子的指针
    //注:void ChangeRL(BiTree &T)中若无&,则ChangeRL(T);是把T的副本作为参数传进去
    //注:&T是对指针的引用
	if(T)//不能使用if(T->lchild && T->rchild)。因为这样会导致判断时先访问这两个指针,如果为空的话就造成访问空指针了
    {
        BiTree temp = T->lchild;//直接用BitTree类型,因为它是指针类型。不然就是 BiTNode *tem;
        T->lchild = T->rchild;
        T->rchild = temp;
        
        ChangeRL(T->lchild);
        ChangeRL(T->rchild);
    }



    
    /**************end************/
}
void PreOrderTraverse(BiTree T)
{//先序遍历
	if(T)
	{
    	cout<<T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}
int main()
{
	char S[100];
	while(cin>>S)
    {
        if(strcmp(S,"0")==0) break;
		int i=-1;
	  	BiTree T;
		CreateBiTree(T,S,++i);
		ChangeRL(T);
		PreOrderTraverse(T);
		cout<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 先序遍历创建二链表存储的二叉树是指按照先序遍历的顺序依次创建二叉树,并用链表的方式存储。具体操作是先读入一个节点的值,如果该节点的值不为空,则创建该节点,并递归创建其左右子树;如果该节点的值为空,则返回上一层递归。遍历操作包括先序遍历、中序遍历和后序遍历,分别是按照根节点、左子树、右子树的顺序遍历、按照左子树、根节点、右子树的顺序遍历、按照左子树、右子树、根节点的顺序遍历。 ### 回答2: 二链表是一种常见的二叉树存储方式。在二链表中,每个节点都包括一个数据域,以及指向左右子节点的指针。通过指针,我们能够在树中方便地进行遍历等操作。 先序遍历创建二链表存储的二叉树的过程如下: 1. 读入一个节点的信息,包括节点的数据和指向其左右子节点的指针。 2. 如果指针指向的是空节点,说明此节点是叶子节点,直接将指针设为空。否则,递归调用函数,读入左右子节点信息。 3. 在递归调用返回后,将指针指向已创建的左右子树。 4. 重复以上过程,直到读到节点数据的结束标志。 在先序遍历创建的过程中,由于我们先读入父节点,所以可以方便地进行遍历操作。先序遍历的顺序是根节点,左子树,右子树。因此,遍历操作可以按照以下过程进行: 1. 访问当前节点的数据域。 2. 如果当前节点的左子树非空,递归遍历左子树。 3. 如果当前节点的右子树非空,递归遍历右子树。 使用递归实现先序遍历的代码如下: ``` void preorderTraversal(BTNode* root) { if(root == NULL) { // 如果树为空,直接返回 return; } printf("%d ", root->data); // 访问当前节点的数据域 preorderTraversal(root->left); // 递归遍历左子树 preorderTraversal(root->right); // 递归遍历右子树 } ``` 除了先序遍历外,还有中序遍历和后序遍历。它们的遍历顺序分别为左子树,根节点,右子树;根节点,左子树,右子树;左子树,右子树,根节点。同样地,它们也可以通过递归实现。在实际程序中,我们常常需要根据具体的需求选择不同的遍历方式。 ### 回答3: 在二叉树的创建和遍历操作中,先序遍历是指在遍历时,先访问节点本身,然后再遍历它的左子树和右子树。这样的遍历顺序就是先序遍历的顺序。在先序遍历中,对于该节点本身而言,先对其进行访问和处理,再对其左子树进行遍历操作,最后再对其右子树进行遍历操作。先序遍历的遍历顺序是根-左-右。 在使用先序遍历创建二叉树的过程中,需要按照先序遍历的顺序输入节点的值,如果该节点存在左子树,则先对左子树进行遍历,否则遍历完成。如果存在右子树,则对右子树进行遍历。按照这种方式,就可以自适应地创建出一棵二叉树。 在先序遍历创建完成二叉树之后,可以使用先序遍历、中序遍历和后序遍历等方法对其进行遍历操作。其中,先序遍历是指按照根-左-右的遍历顺序进行遍历操作,中序遍历是指按照左-根-右的遍历顺序进行遍历操作,后序遍历是指按照左-右-根的遍历顺序进行遍历操作。 在遍历完成后,可以对二叉树进行一系列的操作,例如求二叉树的深度、查找二叉树中是否存在某个元素、删除二叉树中的某个节点等。这些操作都基于遍历算法实现,因此对于遍历算法的理解和掌握是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值