题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
答案:
按照右->中->左的顺序进行遍历。在遍历的过程中将根节点与排序好的链表连起来,更新头结点。
eg:按照右->中->左的顺序,首先遍历16,头结点指向16;然后遍历到14,令14的right指向16,16的left指向14,头结点指向14;然后遍历到12,令12的right指向14,14的left指向12,头结点指向12;一直遍历到4,最终头结点指向4,返回即可。
具体的中序遍历可以由递归与非递归实现。
链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5?f=discussion
来源:牛客网
/** 递归:中序遍历 右 中 左 */
public class Solution {
TreeNode pHead = null; //指向双向链表的头结点
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return pRootOfTree;
Convert(pRootOfTree.right);
if(pHead == null){
pHead = pRootOfTree;
} else {
pHead.left = pRootOfTree;
pRootOfTree.right = pHead;
pHead= pRootOfTree;
}
Convert(pRootOfTree.left);
return pHead;
}
}
/** 非递归 */
import java.util.Stack;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return pRootOfTree;
TreeNode pHead = null;
Stack<TreeNode> s = new Stack<>();
while(pRootOfTree != null || !s.isEmpty()){
if(pRootOfTree != null) {
s.push(pRootOfTree);
pRootOfTree = pRootOfTree.right;
} else {
pRootOfTree = s.pop();
if(pHead == null)
pHead = pRootOfTree;
else {
pHead.left = pRootOfTree;
pRootOfTree.right = pHead;
pHead= pRootOfTree;
}
pRootOfTree = pRootOfTree.left;
}
}
return pHead;
}
}