package com.wsy.converttree;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Convert
{
/*
* 二叉搜索树与双向链表
* 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
*
* 思路:
* 1、首先是排序的双向链表,排序那肯定就是二叉树搜索树的中序遍历:二叉搜索树--根结点大于左孩子,小于右孩子;中序遍历--左根右
* 2、不能创建新结点--借用辅助栈进行中序遍历将结点先保存
* 3、只能调整树种结点指针的指向:结点的left和right指针势必作为双向链表的pre和next指针
*/
public TreeNode convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = pRootOfTree; //当前结点
TreeNode pre = pRootOfTree; //当前结点的前一个结点
boolean isHead = true; //将左树最左边的页结点或根结点作为链表的头结点
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
if(isHead){ //确定头结点
pRootOfTree = cur;
pre = cur;
isHead = false;
}else{ //顺序添加链表节点
pre.right = cur;
cur.left = pre;
pre = cur;
}
cur = cur.right;
}
return pRootOfTree;
}
}
二叉搜索树与双向链表
最新推荐文章于 2022-09-27 14:11:21 发布