6-4 链表拼接 (20分)_[剑指offer]39二叉搜索树转双向链表

今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

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

2 思路----java

  • 按照中序遍历的方式遍历节点并存放于队列中

  • 依次从队列中选取元素,拼接双向链表

c++版本

//中序遍历 然后push到vector中
class Solution {
public:
    vector nodes;void tranverse(TreeNode* pRoot) {if (nullptr == pRoot)return;
        tranverse(pRoot->left);
        nodes.push_back(pRoot);
        tranverse(pRoot->right);
    }TreeNode* adjustTree() {for (int i = 0; i 1; ++i)
            nodes[i]->right = nodes[i+1];
        nodes[nodes.size()-1]->right = nullptr;for (int i = nodes.size() - 1; i > 0; --i)
            nodes[i]->left = nodes[i-1];
        nodes[0]->left = nullptr;return nodes[0];
    }TreeNode* Convert(TreeNode* pRoot){if (nullptr == pRoot)return nullptr;
        tranverse(pRoot);return adjustTree();
    }
};

java版本

// 1 二叉树节点按照中序遍历存放与队列
// 2 依次从队列取出元素 拼接为双向链表

import java.util.*;
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        Queue queue = new LinkedList();
        inOrderToQueue(pRootOfTree, queue);if(queue.isEmpty()){return null;
        }
        pRootOfTree = queue.poll();
        pRootOfTree.left = null;
        TreeNode pre = pRootOfTree;
        TreeNode cur = null;while(!queue.isEmpty()){
            cur = queue.poll();
            pre.right = cur;
            cur.left = pre;
            pre = cur;
        }
        pre.right = null;return pRootOfTree;
    }public void inOrderToQueue(TreeNode head, Queue queue){if(head == null){return;
        }
        inOrderToQueue(head.left, queue);
        queue.offer(head);
        inOrderToQueue(head.right, queue);
    }
}

python版本

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        if pRootOfTree is None:
            return None
        stack = [(pRootOfTree,False)]
        isFirst = True
        pre = None
        while stack:
            cur,flag = stack.pop()
            if cur:
                if flag:
                    if isFirst:
                        root = cur
                        isFirst = False
                        pre = cur
                    else:
                        cur.left = pre
                        pre.right = cur
                        pre = cur
                else:
                    stack.append((cur.right, False))
                    stack.append((cur, True))
                    stack.append((cur.left, False))
        return root

4 唠嗑

2020年8月11日,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。

21f4ee76f43b80505c1f2599ce2d6545.png

[剑指offer]20二叉树的镜像[剑指offer]19连续子数组最大和[剑指offer]2替换空格[剑指offer]3从尾到头打印链表[剑指offer]4栈实现队列[剑指offer]5斐波那契数列[剑指offer]6跳台阶[剑指offer]8二进制中1的个数炸裂!万字长文拿下HTTP
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值