题目
思路
- 首先可以确定是对二叉树进行中序遍历
- 要定义一个prenode,一个curnode,一个headnode
- 首先会找到 最左叶子节点 4,将 headnode 和prenode 赋值为他
- 然后根据中序遍历,curnode会到达节点6 ,将prenode 与curnode之间左右连接,将prenode置为curnode ,继续中序遍历 ,此时 curnode 会来到 8,prenode 为6,连接左右,然后将prenode置为 8,继续遍历。。当遍历完成,整个双向链表也就完成了,头结点自然为 headnode。
代码
/**
*
*/
/***
* @author 18071
* @Date 2019年3月13日
* 功能:二叉搜索树 与双向链表
***/
public class test {
public static void main(String args[]) {
TreeNode root =new TreeNode (4);
root.right=new TreeNode (6);
root.left=new TreeNode (2);
root.left.left=new TreeNode (1);
root.left.right=new TreeNode(3);
Solution s =new Solution();
TreeNode realhead=null;
s.Sys(root);
}
}
//本题重要的一点是不能创建出新的节点
//中序遍历
//
class Solution{
TreeNode realhead=null;
TreeNode prehead=null;
public void Sys(TreeNode root) {
convert(root);
while(realhead!=null) {
System.out.println(realhead.val);
realhead=realhead.right;
}
}
public void convert(TreeNode root) {
if(root==null) {
return ;
}
convert(root.left);
//if()
if(realhead==null) {
realhead=root;
prehead=root;
System.out.println("双线链表头结点已找到 ::"+realhead.val);
}
else {
System.out.println("当前节点为"+ root.val);
System.out.println("当前prehead 节点为"+ prehead.val);
//左右连接
root.left=prehead;
prehead.right=root;
//左右连接
prehead = root ;
}
convert(root.right);
}
}
class TreeNode{
TreeNode left;
TreeNode right;
int val;
TreeNode(int val){
this.val=val;
}
}