Java 实现二叉搜索树改变为双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

这道题思路很简单:
首先搜索树是所有的左子树都小于根,右子树都大于根,所以只需要按中序遍历二叉树后修改每个节点的左右子节点即可:

ArrayList<TreeNode> list = new ArrayList<TreeNode>();
 public TreeNode Convert(TreeNode pRootOfTree) {
  	if(pRootOfTree==null)
            return null;
  
 	 add(pRootOfTree); //将链表元素按照中序遍历存储在链表中
 	 change();//调整左右孩子指向前后节点
 	 return list.get(0);
 }
 private void add(TreeNode pRootOfTree){
  	if(pRootOfTree.left != null)
  		 add(pRootOfTree.left);
 	list.add(pRootOfTree);
  	if(pRootOfTree.right != null)
  		add(pRootOfTree.right);
 }
 private void change(){
  	if(list.size()>=2){
  		//特殊节点特殊处理
   		list.get(0).left = null;
   		list.get(0).right = list.get(1);
   		list.get(list.size()-1).left = list.get(list.size()-2);
   		list.get(list.size()-1).right = null;
   		
   		for(int i=1;i<list.size()-1;i++){
    		list.get(i).left = list.get(i-1);
    		list.get(i).right = list.get(i+1);
   	}
  }
 }

测试:

@Test
 public void fun() {
  	TreeNode root = new TreeNode(5);
  	TreeNode one = new TreeNode(3);
  	TreeNode second = new TreeNode(7);
  	TreeNode q = new TreeNode(2);
  	TreeNode w = new TreeNode(4);
  	TreeNode e = new TreeNode(6);
  	TreeNode r = new TreeNode(8);
  	root.left=one;
  	root.right=second;
  	one.left=q;
  	one.right=w;
  	second.left=e;
  	second.right=r;
  
  	TreeNode node = Convert(root);
  	while(node!=null){
   		System.out.print(node.val+",");
   		node = node.right;
  	}
 }

测试输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值