1.重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reshapeTree(vector<int>ltree,int lbegin,int lend,vector<int>rright,int rbegin,int rend){
if(lbegin>=lend||rbegin>=rend){
return NULL;
}
TreeNode *root = new TreeNode(ltree[lbegin]);
int i;
for(i=rbegin;i<rend;i++){
if(rright[i] == ltree[lbegin])
break;
}
root->left = reshapeTree(ltree,lbegin+1,lbegin-rbegin+i+1,rright,rbegin,i);
root->right = reshapeTree(ltree,lbegin-rbegin+i+1,lend,rright,i+1,rend);
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return reshapeTree(pre,0,pre.size(),vin,0,vin.size());
}
};
2.二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
解题思路
① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点;
② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode->right!=NULL){
TreeLinkNode *node = pNode->right;
while(node->left != NULL){
node = node->left;
}
return node;
}
else{
while(pNode->next!=NULL){
TreeLinkNode *parent = pNode->next;
if(parent->left==pNode)
return parent;
pNode = pNode->next;
}
}
return NULL;
}
};
3.用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。
解题思路
in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int res;
if(stack2.size()!=0){
res = stack2.top();
stack2.pop();
}
else if(stack1.size()!=0){
while(stack1.size()!=0){
int ees = stack1.top();
stack2.push(ees);
stack1.pop();
}
res = stack2.top();
stack2.pop();
}
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
用python实现如下:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
# write code here
self.stack1.append(node)
def pop(self):
# return xx
if self.stack2 == []:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
return self.stack2.pop()