求代码:实现二叉树中所有结点左右子树的交换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求代码:实现二叉树中所有结点左右子树的交换相关的知识,希望对你有一定的参考价值。

要求:对任意一棵二叉树,试将其所有结点的左右子树交换。并将交换前后的不同二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。
最好能有代码语句详细解释

#include<stdio.h>
#include<stdlib.h>
#define max 20//定义树的结点数
#define null 0
typedef struct btnode//定义二叉树结点类型

char date;//结点数据类型
struct btnode *lc,*rc;//左右指针
bttree;
bttree *createtree(char *str,int i,int m)//将字符串str中第i到第m个字符创建树

bttree *p;
if(i>=m)
return null;
p=(bttree*)malloc(sizeof(bttree));//生成新结点
p->date=str[i];//将结点的第一个数据付给根
p->lc=createtree(str,2*i+1,m);//创建左子树
p->rc=createtree(str,2*i+2,m);//创建右子树
return (p);

bttree *jiaohuan(bttree *p)//将p指针指向的二叉树的左右子树进行互换。

bttree *stack[max];//指针类型的堆栈
int k;
k=0;
stack[k]=null;
if(p!=null)//交换p结点的左右孩子

k++;
stack[k]=p->lc;
p->lc=p->rc;
p->rc=stack[k];
p->lc=jiaohuan(p->lc);
p->rc=jiaohuan(p->rc);

return (p);

void xiangen(bttree *t)//先跟遍历

if(t!=null)

printf("%c",t->date);
if(t->lc)

printf("->");
xiangen(t->lc);

if(t->rc)

printf("->");
xiangen(t->rc);



void zhonggen(bttree *p)//中根遍历即中序遍历

if(p!=null)

zhonggen(p->lc);
printf("%c",p->date);
printf("->");
zhonggen(p->rc);


void hougen (bttree *p)//后根遍历

if(p!=null)

hougen(p->lc);
hougen(p->rc);
printf("%c",p->date);
printf("->");


void cengci(bttree *t,int m)//按层次遍历

bttree *queue[max];
bttree *p;
int front=0,rear=0,i;
queue[rear++]=t;
while(front!=rear)

p=queue[front];
front=(front+1)%m;
printf("%c->",p->date);//输出根结点
if(p->lc!=null)//遍历左子树

if((rear+1)%m!=front)

queue[rear]=p->lc;
rear=(rear+1)%m;


if(p->rc!=null)//遍历右子树

if((rear+1)%m!=front)

queue[rear]=p->rc;
rear=(rear+1)%m;




int main()

int i,n;
char str[max];
bttree *root;//二叉树根结点的指针
printf("请输入根结点数目n:");
scanf("%d",&n);
getchar();
printf("请输入%d个结点:",n);
for(i=0;i<n;i++)
str[i]=getchar();
printf("\n\n");
root=createtree(str,0,n);
printf("层次遍历是:\n");
cengci(root,n);
printf("\n先根遍历是:\n");
xiangen(root);
printf("\n中根遍历是:\n");
zhonggen(root);
printf("\n后根遍历是:\n");
hougen(root);
printf("\n\n");
root=jiaohuan(root);//交换左右子树
printf("左右子树交换后!\n");
printf("层次遍历是:\n");
cengci(root,n);
printf("\n先根遍历是:\n");
xiangen(root);
printf("\n中根遍历是:\n");
zhonggen(root);
printf("\n后根遍历是:\n");
hougen(root);
printf("\n\n");
system("pause");



参考技术A #include<stdio.h>
#include<stdlib.h>
#define max 20//定义树的结点数
#define null 0
typedef struct btnode//定义二叉树结点类型

char date;//结点数据类型
struct btnode *lc,*rc;//左右指针
bttree;
bttree *createtree(char *str,int i,int m)//将字符串str中第i到第m个字符创建树

bttree *p;
if(i>=m)
return null;
p=(bttree*)malloc(sizeof(bttree));//生成新结点
p->date=str[i];//将结点的第一个数据付给根
p->lc=createtree(str,2*i+1,m);//创建左子树
p->rc=createtree(str,2*i+2,m);//创建右子树
return (p);

bttree *jiaohuan(bttree *p)//将p指针指向的二叉树的左右子树进行互换。

bttree *stack[max];//指针类型的堆栈
int k;
k=0;
stack[k]=null;
if(p!=null)//交换p结点的左右孩子

k++;
stack[k]=p->lc;
p->lc=p->rc;
p->rc=stack[k];
p->lc=jiaohuan(p->lc);
p->rc=jiaohuan(p->rc);

return (p);

void xiangen(bttree *t)//先跟遍历

if(t!=null)

printf("%c",t->date);
if(t->lc)

printf("->");
xiangen(t->lc);

if(t->rc)

printf("->");
xiangen(t->rc);



void zhonggen(bttree *p)//中根遍历即中序遍历

if(p!=null)

zhonggen(p->lc);
printf("%c",p->date);
printf("->");
zhonggen(p->rc);


void hougen (bttree *p)//后根遍历

if(p!=null)

hougen(p->lc);
hougen(p->rc);
printf("%c",p->date);
printf("->");


void cengci(bttree *t,int m)//按层次遍历

bttree *queue[max];
bttree *p;
int front=0,rear=0,i;
queue[rear++]=t;
while(front!=rear)

p=queue[front];
front=(front+1)%m;
printf("%c->",p->date);//输出根结点
if(p->lc!=null)//遍历左子树

if((rear+1)%m!=front)

queue[rear]=p->lc;
rear=(rear+1)%m;


if(p->rc!=null)//遍历右子树

if((rear+1)%m!=front)

queue[rear]=p->rc;
rear=(rear+1)%m;




int main()

int i,n;
char str[max];
bttree *root;//二叉树根结点的指针
printf("请输入根结点数目n:");
scanf("%d",&n);
getchar();
printf("请输入%d个结点:",n);
for(i=0;i<n;i++)
str[i]=getchar();
printf("\n\n");
root=createtree(str,0,n);
printf("层次遍历是:\n");
cengci(root,n);
printf("\n先根遍历是:\n");
xiangen(root);
printf("\n中根遍历是:\n");
zhonggen(root);
printf("\n后根遍历是:\n");
hougen(root);
printf("\n\n");
root=jiaohuan(root);//交换左右子树
printf("左右子树交换后!\n");
printf("层次遍历是:\n");
cengci(root,n);
printf("\n先根遍历是:\n");
xiangen(root);
printf("\n中根遍历是:\n");
zhonggen(root);
printf("\n后根遍历是:\n");
hougen(root);
printf("\n\n");
system("pause");



参考技术B 求代码:实现二叉树中所有结点左右子树的交换
mp在这里的作用是中间变量,负责将左右孩子的指针调换
相当于我们常见的将a和b的值调换时的操作
(temp = a; a = b; b = temp)

正确的代码体现了这点,而你的代码出现了错误了,解释如下

temp = new NiTNode;//这里没有问题,但是是多余的
//但从你程序上看,你并不清楚,接下来我再说
temp = bt -
参考技术C mp在这里的作用是中间变量,负责将左右孩子的指针调换
相当于我们常见的将a和b的值调换时的操作
(temp = a; a = b; b = temp)

正确的代码体现了这点,而你的代码出现了错误了,解释如下

temp = new NiTNode;//这里没有问题,但是是多余的
//但从你程序上看,你并不清楚,接下来我再说
temp = bt -

js实现堆排序

二叉树:数据结构的一种。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。

堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。

堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆。

堆排序原理:

利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

1.将初始无需数组构建大顶堆(小顶堆)

2.将堆顶元素R(1)与堆末元素R(n)交换,得到无序区R(1)~R(n-1)与有序区R(n),且满足R(1~n-1)<=R(n)

3.将无序区R(1)~R(n-1)继续调整,然后再次将R(1)与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

js代码实现:

/*

维护最大堆性质

@param arr 数组

@param index 元素下标

@param heapSize 堆大小

*/

function maxHeap(arr, index, heapSize){

  var tem = index; //记录入参元素下标

  var leftChildIndex = 2 *i ndex + 1; //元素的左子树的元素下标

  var rightChildeIndex = 2 * index + 2;//元素的右子树的元素下标

  if( leftChildIndex < heapSize && arr[leftChildIndex] > arr[index]){

    index = leftChildIndex;

  }

  if( rightChildeIndex < heapSize && arr[rightChildeIndex] > arr[index]){

    index = rightChildeIndex;

  }

  if(index != tem){

    var t = arr[tem];

    arr[tem] = arr[index];

    arr[index] = t;

    maxHeap(arr, index, heapSize);

  }

}

/*

构建最大堆

@param arr 数组

*/

function buildMaxHeap(arr){

  var lastFather = Math.floor(arr.length / 2) - 1;//堆的最后一个父节点

  for(var i = lastFather; i > 0; i --){

    maxHeap(arr, i, arr.length);

  }

}

/*

堆排序

@param arr 待排序数组

*/

function heapSort(arr){

  var len = arr.length;

  var tem;

  buildMaxHeap(arr);

  for(var i = len - 1; i > 0; i --){

    tem = arr[i];

    arr[i] = arr[0];

    arr[0] = tem;

    maxHeap(arr, 0 , --len);

  }

  return arr;

}

 

以上是关于求代码:实现二叉树中所有结点左右子树的交换的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 27. 二叉树的镜像 题解

数据结构-树二叉树的相关算法

二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树

题目3. 平衡二叉树算法查找树中某节点的时间复杂度是多少?

二叉树的镜像(反转二叉树)

js实现堆排序