博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day37:二叉搜索树与双向链表(递归)
阅读量:229 次
发布时间:2019-03-01

本文共 718 字,大约阅读时间需要 2 分钟。

问题描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
在这里插入图片描述

巧妙地利用二叉搜索树的特点,二叉搜索树是树的中序遍历,就在中序递归遍历的基础上改了一点点,用一个pre指针保存中序遍历的前一个结点。因为是中序遍历,遍历顺序就是双线链表的建立顺序;

每一个结点访问时它的左子树肯定被访问过了,所以放心大胆的改它的left指针,不怕树断掉;同理,pre指向的结点保存的数肯定小于当前结点,所以其左右子树肯定都访问过了,所以其right指针也可以直接改。最后需要一直向左找到双向链表的头结点。
(解法出处:)

class Solution {
public: TreeNode* pre=NULL; TreeNode* convert(TreeNode* root) {
dfs(root); while(root && root->left) root = root->left; return root; } void dfs(TreeNode* root){
if(!root) return; dfs(root->left); root->left = pre; if(pre) pre->right = root; pre = root; dfs(root->right); } };

转载地址:http://znkt.baihongyu.com/

你可能感兴趣的文章