您的位置:首页 > 职场人生

面试训练树的镜像

2012-09-09 14:03 176 查看


这道题一接触感觉有点陌生了,但是镜像 怎么表示的呢

1 1

/ \ 镜像 / \

2 3 ------------------------> 3 2

/ \ / \ / \ / \

5 6 7 8 8 7 6 5

画了图以后看起来貌似有点意思,所有非叶结点都进行左右子树的互换,可以从根结点开始,从顶向底开始遍历二叉树得到相关的树的结构

其实也就是先序遍历,然后转换左右子树的过程,如果为叶节点停止呗,还是比较easy的

使用递归法建树输入比较蛋疼,上面的树建立输入过程为

1 2 5 -1 -1 6 -1 -1 3 7 -1 -1 8 -1 -1 先序建立树,并且叶子节点还需要赋值为-1这样才能完整建立树,这里的概念有点忘了,需要加深记忆

#include "stdio.h"
typedef struct Node{
	 int key;
	 struct Node *left;
	 struct Node *right;
}Lnode;
void buildTree(Lnode **head)
{
	Lnode *p=NULL;
	int value;
	scanf("%d",&value);
	if(value ==-1)
	{
		*head=NULL;
	}
	else
	{
		
		p = (Lnode *)malloc(sizeof(Lnode));
		p->key = value;
		*head=p;
		buildTree(&((*head)->left));
		buildTree(&((*head)->right));
	}
	return;

}
void traverse(Lnode *p)
{
	if(p==NULL)
		return;
	printf("%d ",p->key);
	traverse(p->left);
	traverse(p->right);
}
void mirrorTree(Lnode *head)
{
	Lnode *p=NULL;
	if(head==NULL)
		return;
	if(head->left==NULL&&head->right==NULL)
		return;
	p=head->right;
	head->right=head->left;
	head->left=p;
	mirrorTree(head->left);
	mirrorTree(head->right);

}
int main()
{

	Lnode *head=NULL;
	int totalNum= 10;
	int index =0;
	int value=0;	
	buildTree(&head);
	traverse(head);
	mirrorTree(head);
	traverse(head);
	return 0;
}


我认为后面有必要写一份专门建二叉树,建树的单元复习,这个太重要了~

书里面作为扩展,还要求是否可以不用递归解决呢。

当然可以,需要队列,用c++的Stl做估计很简单,可以我用纯c啊,压力巨大说下思路吧

首先根结点进入队列

while循环 判断队列是否为空

首节点出队列,交换左右节点

(当然叶子节点就不用进队列了)

然后左节点进队列,右节点进队列

这么一来交换过程就改为顺序处理了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: