今天开始讲和大家坚持打卡面试非常重要算法练习---剑指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找到理想的工作。如果你想加入,加我拉你进面试交流群。