尝试一
刚开始,找不到头绪,看了一下 讨论 的递归版。
result:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:
/**
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;
}
/*分别求左子树的链表和右子树的链表*/
TreeNode rear=myConvert(pRootOfTree.left,true);
TreeNode head= myConvert(pRootOfTree.right,false);
/*重置头节点*/
pRootOfTree.left=null;
pRootOfTree.right=null;
/*合并链表*/
if(rear!=null){
rear.right=pRootOfTree;
pRootOfTree.left=rear;
}
if(head!=null)
{
pRootOfTree.right=head;
head.left=pRootOfTree;
}
/*遍历求出链表的头节点*/
TreeNode i=pRootOfTree;
while (pRootOfTree.left!=null){
i=pRootOfTree.left;
pRootOfTree=pRootOfTree.left;
}
return i;
}
/*
* root:表示当前节点节点
* toLeft:为true表示root是一个左节点。false:表示是一个右节点
*
*/
private TreeNode myConvert(TreeNode root,boolean toLeft){
/*递归结束标识*/
if(root==null){
return null;
}
//往左走,就应该返回左半部分的链表的最后一个节点rear
TreeNode rear= myConvert(root.left,true);
/*rear为null就不做处理*/
if(rear!=null){
rear.right=root;
root.left=rear;
}
//往右走,就应该返回有半部分的链表的第一个节点head
TreeNode head=myConvert(root.right,false);
/*head为null就不做处理*/
if(head!=null){
root.right=head;
head.left=root;
}
/*toLeft就返回当前链表的最右一个节点rear.否则,就返回当前链表的最最一个节点*/
//表示返回rear or head 节点
TreeNode roh=root;
if(toLeft){
while(roh.right!=null){
roh=roh.right;
}
}else{
while(roh.left!=null){
roh=roh.left;
}
}
return roh;
}
}
分析:分别求二叉树的左右子树对应的链表,然后将左右链表和root节点合并起来。
结论
- 二叉树这个结构可以转换为链表。并且搜索二叉树更是可以转换为一个排序好的双向链表。