剑指offer二十六之二叉搜索树与双向链表
一、题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二、思路
对二叉搜索树中序遍历的结果即为排序的结果,在中序遍历的过程中,建立双向指针。详细过程见代码注释。
三、代码
public class Solution { TreeNode tempHead = null; // TreeNode realHead = null; //保存双向链表的头结点 public TreeNode Convert(TreeNode pRootOfTree) { //如果头结点为空,返回null if (pRootOfTree == null) { return null; } //转换 ConvertMethod(pRootOfTree); //返回双向链表的头结点 return realHead; } //采用递归的方法进行中序遍历,遍历过程中,建立头结点和下一个节点的双向指针 public void ConvertMethod(TreeNode pRootOfTree) { //递归遍历左节点 if (pRootOfTree.left != null) { ConvertMethod(pRootOfTree.left); } //建立根节点与下一个节点的双向指针 if(tempHead==null){ //第一次运行的时候,头结点为空,初始化头结点 tempHead=pRootOfTree;//用于记录当前头结点 realHead=pRootOfTree;//用于记录双向链表的头结点 }else { //第一次运行以后,建立tempHead节点与其下一个节点的双向指针 //建立当前头结点与下一个节点的双向指针 tempHead.right = pRootOfTree; pRootOfTree.left = tempHead; tempHead = pRootOfTree; //当前头节点后移一位 } //递归遍历右节点 if (pRootOfTree.right != null) { ConvertMethod(pRootOfTree.right); } } }
public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }
------------------------------------------------------
参考链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5