面试训练树的镜像
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循环 判断队列是否为空
首节点出队列,交换左右节点
(当然叶子节点就不用进队列了)
然后左节点进队列,右节点进队列
这么一来交换过程就改为顺序处理了。
相关文章推荐