[程序猿面试题精选100称号]1.转变为一个二叉搜索树有序双向链表
2015-07-01 18:08
531 查看
【称号】
一棵二叉查找树,将该二叉查找树转换成一个排序的双向链表。要求不能创建不论什么新的结点,仅仅调整指针的指向。
比方将二叉查找树
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表4=6=8=10=12=14=16
參考:程序猿面试题精选100题(01)-把二元查找树转变成排序的双向链表
【思路】
本题是微软的面试题。非常多与树相关的题目都是用递归的思路来解决。本题也不例外。
我们能够中序遍历整棵树。依照这个方式遍历树,比較小的结点先訪问。如果我们每訪问一个结点。如果之前訪问过的结点已经调整成一个排序双向链表,
我们再把调整当前结点的指针将其链接到链表的末尾。
当全部结点都訪问过之后。整棵树也就转换成一个排序双向链表了。
【代码】
/********************************* * 日期:2013-12-17 * 作者:SJF0115 * 题目: 把二元查找树转变成排序的双向链表 * 来源:微软 * 分类:经典面试题 **********************************/ #include <iostream> using namespace std; struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; //中序遍历过程中改变 // 转换后pre指向双向链表的最后一个节点 // root成为中间节点 void ConvertDoubleList(TreeNode* root, TreeNode*& pre) { if(root == NULL){ return; } // 当前节点 TreeNode* cur = root; // 左子节点 if(cur->left){ ConvertDoubleList(cur->left,pre); } // 中间节点 改成双向链表 cur->left = pre; if(pre != NULL){ pre->right = cur; }//if // 前一节点 pre = cur; // 右子节点 if(cur->right){ ConvertDoubleList(cur->right,pre); }//if } // 二叉查找树插入 void TreeInsert(TreeNode*& root,int val){ // 创建新节点 TreeNode* node = new TreeNode(val); if(root == NULL){ root = node; } else{ TreeNode *pre = NULL; TreeNode *cur = root; // 寻找插入位置 while(cur){ // 父节点 pre = cur; // 沿左子树方向下降 if(val < cur->val){ cur = cur->left; } // 沿右子树方向下降 else{ cur = cur->right; } }//while // 插入左子结点处 if(val < pre->val){ pre->left = node; } // 插入右子结点处 else{ pre->right = node; }//if }//if } // 中序遍历 void InOrder(TreeNode* root){ if(root == NULL){ return; } if(root->left){ InOrder(root->left); } cout<<root->val<<endl; if(root->right){ InOrder(root->right); } } //输出双向链表 void PrintDoubleList(TreeNode *head){ TreeNode *cur = head; if(cur == NULL){ return; } // 反向遍历 while(cur->left){ cout<<cur->val<<"->"; cur = cur->left; } cout<<cur->val<<"->NULL"<<endl; // 正向遍历 while(cur){ cout<<cur->val<<"->"; cur = cur->right; } cout<<"NULL"<<endl; } int main(){ int array[] = {10,6,14,4,8,12,16}; // 创建二叉查找树 TreeNode *root = NULL; for(int i = 0;i < 7;i++){ TreeInsert(root,array[i]); } // 中序遍历 // InOrder(root); // 二叉查找树转换为双向链表 TreeNode *pre = NULL; ConvertDoubleList(root,pre); // 打印双向链表 PrintDoubleList(pre); return 0; }
相关文章推荐
- 面试题14:调整数组顺序使奇数位于偶数前面
- .net 高频面试题
- 摘录-IT企业必读的200个.NET面试题-03 .NET类型语法基础
- 面试资料整理
- 面试题13:在O(1)时间删除链表结点
- 黑马程序员——Java基础---正则表达式
- 关于JAVA中继承相关面试extends
- Android面试题1
- 黑马程序员——Java基础之反射,正则表达式
- 面试题17:合并两个排序链表
- “三无”人员如何在面试中逆袭
- 面试题16:反转链表
- char str[] 和 char *str 的区别(p66程序员面试宝典)
- js面试题之数组去重和快速排序
- 腾讯百度面试题集锦
- 珍藏文:程序员面试什么最重要?-----性格大于能力
- 谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式
- 黑马程序员----ios的核心架构的学习
- 黑马程序员——Java基础--多线程(一)
- 初级程序员学习新编程技术的5个诀窍