博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer——二叉搜索树与双向链表
阅读量:4684 次
发布时间:2019-06-09

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

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

 

利用中序遍历法,记录一个前驱结点,然后将当前结点的左孩子指向前驱节点,这样的话,向左<---表示逆序,然后将前驱结点的右孩子指向当前节点-->,可以形成正序。

在这里记录的前驱节点不能在方法内部传递,不知道为什么

 

/**public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}*/public class Solution {    TreeNode pre = null;    public TreeNode Convert(TreeNode pRootOfTree) {        if(pRootOfTree == null) return null;        inOrder(pRootOfTree);        TreeNode res = pRootOfTree;        while(res.left != null){            res = res.left;        }        return res;    }    public void inOrder(TreeNode root){        if(root == null) return;        inOrder(root.left);        if(pre == null){            pre = root;        }else{            pre.right = root;            root.left = pre;            pre = root;        }        inOrder(root.right);    }}

  

这样就不对,但是看C++的代码就是这样的,而且运行也正确,想不通

public class Solution {    public TreeNode Convert(TreeNode pRootOfTree) {        TreeNode pre = null;        inOrder(pRootOfTree, pre);        TreeNode res = pRootOfTree;       while(res.left!= null){           res = res.left;       }        return res;    }         public void inOrder(TreeNode root, TreeNode pre){        if(root == null) return;        inOrder(root.left, pre);        root.left = pre;        if(pre != null) pre.right = root;        pre = root;        inOrder(root.right, pre);    }}

  

 可以AC的C++代码

class Solution {public:    TreeNode* Convert(TreeNode* pRootOfTree)    {        if(pRootOfTree == nullptr) return nullptr;        TreeNode* pre = nullptr;                  convertHelper(pRootOfTree, pre);                  TreeNode* res = pRootOfTree;        while(res ->left)            res = res ->left;        return res;    }          void convertHelper(TreeNode* cur, TreeNode*& pre)    {        if(cur == nullptr) return;                  convertHelper(cur ->left, pre);                  cur ->left = pre;        if(pre) pre ->right = cur;        pre = cur;                  convertHelper(cur ->right, pre);    }};

  

转载于:https://www.cnblogs.com/SkyeAngel/p/8680920.html

你可能感兴趣的文章
规划网站
查看>>
面向对象(基础oop)之属性与构造函数
查看>>
Linux网络栈协议无关层--BSD socket
查看>>
FZU 2202——犯罪嫌疑人——————【思维题】
查看>>
SEO知识图一
查看>>
USACO hamming
查看>>
[开源JVM] yvm - 自制Java虚拟机
查看>>
Open vSwitch安装
查看>>
HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
查看>>
document.domain 跨域问题[转]
查看>>
【Android】 No Activity found to handle Intent.
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
Struts2 Action名称的搜索顺序
查看>>
C++ sort简单用法
查看>>
Oracle分区索引
查看>>
4.17上午
查看>>
IIS的ISAPI接口简介
查看>>
python:open/文件操作
查看>>
16 乘法口诀输出
查看>>
mac 常用地址
查看>>