题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
利用一个栈实现二叉树的中序遍历,题中说这是一颗二叉树,那么二叉树的中序遍历是一个有顺序的, 那么这个时候只需要在中序遍历的时候当找到一个遍历节点的时候先将这个节点保存起来,然后遍历下一个节点的时候将之前保存的节点的right域指向下一个结点,下一个结点的left域指向上一个结点。这样一来就形成了一个排序的双向链表。然后将之前指向保存的指针指向当前这个结点。
实现:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
/*
其实这是一个TreeNode的遍历,利用一个栈实现二叉树的中序遍历,题中说这是一颗二叉树,那么二叉树的中序遍历是一个有顺序的,
那么这个时候只需要在中序遍历的时候当找到一个遍历节点的时候将这个节点保存起来,然后遍历下一个节点的时候将保存的节点的right域指向
下一个结点,下一个结点的left域指向上一个结点。这样一来就形成了一个排序的双向链表
*/
public TreeNode Convert(TreeNode pRootOfTree) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode current = pRootOfTree;
TreeNode node = null;
TreeNode retRoot = null;
while(current != null || !stack.isEmpty()){
if(current != null){
stack.push(current);
current = current.left;
}else{
current = stack.pop();
if(node == null){
node = current;
retRoot = node;
}else{
node.right = current;
current.left = node;
node = node.right;
}
current = current.right;
}
}
return retRoot;
}
}