面试题27:二叉排序树转换成有序双向链表
来源:互联网 发布:知乎论文转成word 编辑:程序博客网 时间:2024/05/16 17:11
题目描述:将二叉排序树转换成一个排序的双向链表,要求:不能创建任何新的节点,只能通过调整指针的指向来实现;
二叉排序树的一个很重要的特性就是:二叉树中序遍历的结果是一个递增的序列。由这个特性可以知道该题需要通过中序遍历的思想来解决。
- 按照中序遍历的递归思路,先遍历左子树,然后处理根节点,最后遍历右子树。关键的步骤在于处理根节点。
如下图所示,我们通过中序递归遍历过程中的一个状态来解析转换的过程,当中序遍历root指向10时,要满足转换成双向有序链表的请求,结点10左指针必须指向它中序遍历的前一个结点8,而前一个结点8的右指针必须指向结点10。
- 设置一个初始的last节点,假设它是双链表的最后一个节点。root的left指向last,last的right指向root,最后用root代替原来的last,root就成了双向链表的最后一个节点
代码如下:
root->left = last;last->right = root;last = root;
生成的双链表,前驱指针是left,后接指针是right。
这样才能把这两个结点双向连接起来,转换完成后,需要找到双向链表的头节点,也就是最左边的叶子节点。
下面是详细的实现代码:
//结点的结构struct BSTNode{ int data; BSTNode *left; BSTNode *right;};//主函数BSTNode* Convert2DoubleLinkList(BSTNode *root){ if(root == NULL) return NULL; BSTNode *last = NULL; //二叉排序树转换成排序双向链表 Convert(root, &last); //取得双向链表的头指针 while(root->left != NULL) root = root->left; return root;}//二叉排序树转换成双向链表void Convert(BSTNode *root, BSTNode** last){ if(root == NULL) return; //遍历左子树 Convert(root->left, last); //处理根节点 root->left = *last; if((*last) != NULL) (*last)->right = root; *last = root; //遍历右子树 Convert(root->right, last);}
阅读全文
0 0
- 面试题27:二叉排序树转换成有序双向链表
- 面试题27:二叉排序树转双向链表
- 剑指offer面试题27BST转换为有序双向链表
- 面试题27:二叉搜索树转换为有序双向链表
- 360面试题——搜索二叉树转换成有序的双向链表
- 面试题: 二叉搜索树转换成有序双向链表
- 二叉排序树转化为有序双向链表
- 静态变量的应用--将二叉排序树转换为有序的双向链表输出
- 微软面试题,将二叉排序树转换成双向链表
- 【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
- 微软,Google面试题 (1) —— 把二叉排序树转变成排序的双向链表
- 将二叉排序树BST转换成排序的双向链表
- 二叉排序树转换成排序的双向链表
- 二叉排序树转换成排序的双向链表
- 二叉排序树向双向链表的转换
- 二叉排序树与双向链表的转换
- 【面试题】二叉搜索树转换双向链表
- 二叉搜索树转换成有序双向链表
- Lua中的模块(module)和包(package)详解
- B树、B+树、LSM树以及其典型应用场景
- xcode 9导入的png图片显示不出来
- 8.3基数排序
- Photoshop详细教程一之魔棒与套索工具的使用
- 面试题27:二叉排序树转换成有序双向链表
- FineCMS 5.0.10漏洞集合
- 阿里王坚:数据重塑城市未来
- 面试记录第十八节——(冷启动)
- IDEA-CAS-SSO单点登录-数据库
- Regular 三 贪 婪 与 非 贪 婪
- java.lang.IllegalStateException: network interceptor Retrofit must call proceed() exactly once
- HDU 1869:六度分离
- 最全面的JavaScript调试技巧总结