微软等面试100题第一题

来源:互联网 发布:ios能用java开发吗 编辑:程序博客网 时间:2024/05/16 23:56
 最近一直看周磊July 的博客,挺牛的一个人,一直想学习算法,通过实际的问题来锻炼自己的编程能力,在这里感谢他的无私奉献, http://blog.csdn.net/v_JULY_v 所以在我心里决定从今天开始一步一步来研究这些问题,也希望将自己的心得大家一起分享,毕竟个人的编程能力有限,可能有编程过程中会参考周磊July 的博客,对于后面的文件如有与周磊July 的博客有相似之处,可能是参考其博客,只是想通过这中方式在提高自己的编程能力的同时,与打击一起分享编程的喜悦。题目顺序参考周磊July 的博客中的微软面试100题2010年版全部答案集锦(含下载地址)

 

1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
 
   10
   / /
  6  14
/ / / /
4  8 12 16
 
转换成双向链表
4=6=8=10=12=14=16。

 

#include <stdio.h>//#include <StdAfx.h>#include <stdlib.h>/* *   定义二叉树的结构 */typedef struct TreeNode *link;struct TreeNode{    int value;    link LeftChild;    link RightChild;};/* *list为双向排序链表 */link list = NULL;/* * 定义结点初始化函数,用来方便生成树 */link initNode(int i){    link t = (link)malloc(sizeof(*t));    t->value = i;    t->LeftChild = NULL;t->RightChild = NULL;return t;    }/* *  visit函数递归调用,前序遍历二元查找树的每一个结点 *  并在适当的时候,将结点插入到双向排序链表中 */void  visit(link t){/* *  递归左子 */if (t->LeftChild != NULL){visit(t->LeftChild);}/* * 处理当前结点,主要是为了中序遍历树的时候,进行转化为链表 */if (list == NULL)  //{list = t;t->LeftChild = NULL;}else{list->RightChild = t;t->LeftChild = list;list = t;}/* *  递归右子 */if (t->RightChild != NULL){visit(t->RightChild);}}int main(){/* 产生测试 */link root = initNode(10);root->LeftChild = initNode(6);root->RightChild = initNode(14);root->LeftChild->LeftChild = initNode(4);root->LeftChild->RightChild = initNode(8);root->RightChild->LeftChild = initNode(12);root->RightChild->RightChild = initNode(16);visit(root);printf("逆序输出:\n");while (list->LeftChild != NULL){printf("%d\t",list->value);list = list->LeftChild;}printf("%d\n",list->value);printf("正序输出:\n");while (list->RightChild != NULL){printf("%d\t",list->value);list = list->RightChild;}printf("%d\n",list->value);    return 0;}


具体参考了ChennySmallHouse谢谢他的分享

原创粉丝点击