T1 根据二叉树创建字符串
思路:
首先题目要求我们需要将各个元素的子集加上括号用前序遍历的方式显示出来,前序遍历二叉树需要用到递归,先出根节点接着是左子树和右子树,在输出子树之前我们给返回的字符串ret加上左括号 '(' ,输出完子树后再加上右括号 ')'。初步实现如下所示。
然后题目中描述,有一些情况我们需要省略掉加括号的步骤,
遍历左子树前:如果当前节点的左右子树都是空的那么就要省略括号。否则只要当前节点的左右节点有一个不为空,那么无论左节点是否是空都要输出它的值。
遍历右子树前:如果 当前节点的右子树为空就省略掉括号。否则就输出右节点的值。
T2 二叉树的层序遍历
思路:
用一个队列去承载每一层的元素,用一个变量去记录本层元素的个数。并且在将本层元素出队列的时候把下一层的元素存储到队列中。本层元素全部出完后下一层的元素也都进入到了队列中,队列中的元素个数就是下一层的元素个数。每次出队列的元素我们都是用一个vector<int>的顺序表去记录每个元素的值。以下是具体的实现。
T3 二叉树的最近公共祖先
首先使用两个栈去存放p和q的路径(使用函数 find_path ),然后将p和q的路径长度修剪一致,最后从栈顶开始找到最近的一个相同节点。
寻找路径(find_way函数)通过递归的方法现将节点入栈,再判断节点的左右两边是否有自己想要找的数据find_x,如果找到find_x 就返回true,否则将栈中的数据弹出并且返回false
T4 二叉树搜索树转换成排序双向链表
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void inorder_convert(TreeNode* cur,TreeNode*& prev)
{
if(cur==nullptr)
return;
else
{
inorder_convert(cur->left, prev);
cur->left = prev;
if(prev)
prev->right=cur;
prev=cur;
inorder_convert(cur->right, prev);
}
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* cur =pRootOfTree;
TreeNode* prev=nullptr;
inorder_convert(cur,prev);
while(cur && cur->left)
{
cur=cur->left;
}
return cur;
}
};
T4 非递归的先序遍历
思路:每次先用vector存储节点的值,再用一个栈存储根节点,并且依次去遍历自己的左子树,左节点遍历到最后一个以后再去访问右子树。右子树的访问方式也是先访问左子树再访问右子树。
T5 非递归的后序遍历
思路:先遍历左子树,并且入栈,等左子树的遍历完毕后,取栈顶元素(栈顶元素为左子树的每一个节点)看此节点的右子树是否为空或者右子树遍历过了,条件满足的话就可以将该元素弹出,如果不满足条件的话就继续遍历右子树。
其中采用prev存储当前遍历元素的前一个元素,如果前一个元素等于当前访问元素的右节点那么就说明右子树已经访问过了,可以输出当前节点。