剑指offer——面试题27:二叉搜索树与双向链表
2015-08-19 15:51
447 查看
题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
这道题的思路是采用递归的思想,我的是采用后序遍历,每次返回的是已经改变好的双向链表,只不过返回的那个节点root在中间
那么它的左子树那边返回我需要向右移动到最后一个结点,(相当于遍历了左子树)
右子树返回的我需要向左移动到最开始那个节点,(相当于遍历了右子树)
然后与这个根节点连接起来(相当于最后遍历根节点)在这里需要的互相连接,开始就是这里出了问题。
下面是代码:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
这道题的思路是采用递归的思想,我的是采用后序遍历,每次返回的是已经改变好的双向链表,只不过返回的那个节点root在中间
那么它的左子树那边返回我需要向右移动到最后一个结点,(相当于遍历了左子树)
右子树返回的我需要向左移动到最开始那个节点,(相当于遍历了右子树)
然后与这个根节点连接起来(相当于最后遍历根节点)在这里需要的互相连接,开始就是这里出了问题。
下面是代码:
#include<iostream> using namespace std; struct Node { int val; Node* left; Node* right; Node(int x):val(x),left(NULL),right(NULL){} }; Node* change(Node* root) { if(root==NULL) return root; if(root->left==NULL&&root->right==NULL) return root; Node* root1=NULL; Node* root2=NULL; if(root->left!=NULL) { root1=change(root->left); while(root1->right!=NULL) root1=root1->right; } if(root->right!=NULL) { root2=change(root->right); while(root2->left!=NULL) root2=root2->left; } root->left=root1; root1->right=root; root->right=root2; root2->left=root; return root; } int main() { Node* root=new Node(10); root->left=new Node(6); root->right=new Node(14); root->left->left=new Node(4); root->left->right=new Node(8); root->right->left=new Node(12); root->right->right=new Node(16); Node *root2=change(root); while(root2->left!=NULL) root2=root2->left; system("pause"); }
相关文章推荐
- .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示
- .Net程序员安卓学习之路4:使用xutils Get Post数据
- .Net程序员安卓学习之路1:登陆界面
- 一道腾讯面试题
- 纪念我的第一次面试——华为研发类面试
- 黑马程序员—多线程
- 2016阿里面试题整理与分析(更新中。。。)
- 分享干货 码农必备各种API20
- 参考大神的职业规划路线(变相技能树)
- 程序员必看--23种设计模式及解释(中英文对照)——每天都要坚持看上几遍
- 黑马程序员—接口,异常,包
- 剑指offer-第四章解决面试题思路(复杂链表的复制)
- 一个程序员的成长独白
- 苹果公司职员开发常用的设计模式
- 某互联网旅游公司面试 补充更新中
- 程序员必须掌握的十种算法---二分查找算法
- 黑马程序员—多态,内部类
- java面试笔试大汇总
- java笔试面试经典问题
- 黑马程序员—继承,抽象类