package java2019;
import java.util.Stack;
//输入一个二叉搜索树,将该树转换为一个排序的双向链表(不创建新的节点,只能调整树中节点指针的指向)
//核心是中序遍历非递归算法
//修改当前遍历节点与前一遍节点的指针指向
public class Demo24 {
//中序非递归算法
public void InorderTravel(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = root;
while(p!=null||!stack.empty()){
while(p!=null){ //一直向左并将沿途节点压入堆栈
stack.push(p);
p=p.left;
}
p=stack.pop();
System.out.println(p.val+" ");
p=p.right;
}
}
//前序非递归算法
public void PreorderTravel(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = root;
while(p!=null||!stack.empty()){
while(p!=null){ //一直向左并将沿途节点压入堆栈
System.out.println(p.val+" ");
stack.push(p);
p=p.left;
}
p=stack.pop();
p=p.right;
}
}
//非递归版
public TreeNode ConvertBSToBiList(TreeNode root){
if(root==null)
return null;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = root;
TreeNode pre = null; //用于保存中序遍历的上一结点
boolean isFirst = true;
while(p!=null || !stack.empty()){
while(p!=null){
stack.push(p);
p=p.left;
}
p=stack.pop();
if(isFirst){
root=p;//将中序遍历的第一个节点记为root
pre=root;
isFirst=false;
}else{
pre.right=p;
p.left=pre;
pre=p;
}
p=p.right;
}
return root;
}
public static void main(String[] args) {
TreeNode root = new TreeNode(5);
TreeNode n1 = new TreeNode(3);
TreeNode n2 = new TreeNode(10);
TreeNode n3 = new TreeNode(1);
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(6);
TreeNode n6 = new TreeNode(11);
root.left=n1;
root.right=n2;
n1.left=n3;
n1.right=n4;
n2.left=n5;
n2.right=n6;
Demo24 d24 = new Demo24();
d24.PreorderTravel(root);
}
}
来源:CSDN
作者:meiquanGao
链接:https://blog.csdn.net/qq_43718903/article/details/103617767