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

方法一:

1.将二叉搜索树中序遍历出来,并把每个节点都保存在一个list中

2.改变list中每个元素的指向

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.ArrayList;
import java.util.List;

public class Solution {
	
	List<TreeNode> list=new ArrayList<TreeNode>();
	
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null) return null;
    	TreeNodeToList(pRootOfTree);
    	convertPoint(pRootOfTree);
    	return list.get(0);
    }

	//改变list中所有treeNode的指向
	private void convertPoint(TreeNode pRootOfTree) {
		// TODO Auto-generated method stub
		for(int i=0;i<list.size()-1;i++) {
			list.get(i).right=list.get(i+1);
			list.get(i+1).left=list.get(i);
		}
		
	}
    //进行终须遍历并把treeNode放入list中
	private void TreeNodeToList(TreeNode pRootOfTree) {
		if(pRootOfTree.left!=null) {
			TreeNodeToList(pRootOfTree.left);
		}
		list.add(pRootOfTree);
		if(pRootOfTree.right!=null) {
			TreeNodeToList(pRootOfTree.right);	
		}
	}
	
}

方法二:

在中序遍历的过程中记录其前一个节点,并改变前一个节点和该节点的指向

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/

import java.util.ArrayList;
import java.util.List;


public class Solution {

	TreeNode preNode=null;  //前一个节点
	TreeNode nowNode=null;    //当前节点
	TreeNode headNode=null;    //头结点
	
	 public TreeNode Convert(TreeNode pRootOfTree) {
	    	if(pRootOfTree==null) return null;
	    	TreeNodeToList(pRootOfTree);
	    	return headNode;
	    }

    //进行中序遍历
	private void  TreeNodeToList(TreeNode pRootOfTree) {
		
		if(pRootOfTree.left!=null) {
			TreeNodeToList(pRootOfTree.left);
		}
		preNode=nowNode;
		nowNode=pRootOfTree;
		if(preNode!=null) {
            //改变指向
			preNode.right=nowNode;
			nowNode.left=preNode;
		}else {
			headNode=nowNode;    //若前一个节点为空,则当前节点必转换后的头结点
		}
		if(pRootOfTree.right!=null) {
			TreeNodeToList(pRootOfTree.right);	
		}
		
	}

}
发布了41 篇原创文章 · 获赞 1 · 访问量 1863

猜你喜欢

转载自blog.csdn.net/qq_38087131/article/details/105297608