更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
T:
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
这道题目,解决思路不难,类似于先序遍历,只不过要在压栈和出栈的过程中,把树的结构变为一个双向链表。
一张图解释用栈的解题思路:
详细说明都在代码注释当中.
code:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
/**
* T: 二叉搜索树与双向链表
*
* 题目描述
* 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
* 要求不能创建任何新的结点,只能调整树中结点指针的指向。
*
* date: 2015.12.3 19:54
* @author SSS
*
*/
public class Solution {
// 全局变量,设置一个栈,用于存放节点
Stack<TreeNode> nodeStack = new Stack<TreeNode>();
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return pRootOfTree;
}
// 找到头结点,即最左边的节点
TreeNode headNode = new TreeNode(0);
this.pushStack(pRootOfTree);
// 找到头结点
headNode.right = nodeStack.peek();
// preNode为当前的指针节点,指向当前最前端的节点
TreeNode preNode = headNode;
// 每次弹出一个元素,首先进行双链接,然后看该节点是否有右子树
// 有的话,把右子树也添加进去
while (!nodeStack.isEmpty()) {
TreeNode tempNode = nodeStack.pop();
// 弹出一个元素,就要进行一次双向链接
preNode.right = tempNode;
tempNode.left = preNode;
preNode = tempNode;
// 如果右侧不为null,说明该节点还有右子树
if (tempNode.right != null) {
this.pushStack(tempNode.right);
}
}
// 与虚设的节点断绝关联
headNode.right.left = null;
return headNode.right;
}
/**
* 函数功能:将参数节点所有的左节点递归地压入栈
* @param elementNode
*/
public void pushStack(TreeNode elementNode) {
TreeNode tempNode = new TreeNode(0);
tempNode = elementNode;
while (tempNode != null) {
nodeStack.add(tempNode);
tempNode = tempNode.left;
}
}
}
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~