知识点/数据结构:二叉树和双向链表
题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,分别指向前一个节点和都一个节点。由于这两种数据结构相似,同时二叉树搜索树是一种排序的数据结构。
在二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值。因此我们在转换的时候:原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针
中序遍历的算法的特点就是从小到大的顺序遍历二叉树的每个节点。可以按照这种思路进行代码的编写。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree==null) return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null) return pRootOfTree;
TreeNode left = Convert(pRootOfTree.left);
TreeNode p = left;
while(p!=null&&p.right!=null){ //这个while循环是找到左子树中的最大值,然后把它连接到父节点
p=p.right;
}
if(left!=null){
p.right=pRootOfTree;
pRootOfTree.left=p;
}
TreeNode right = Convert(pRootOfTree.right);
if(right!=null){
pRootOfTree.right=right;
right.left=pRootOfTree;
}
return left!=null ? left : pRootOfTree;
}
}