目录
二叉树的下一个结点
描述:给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
思路:分结点类型进行讨论。如果结点有右子树,则下一个结点是右子树的最左结点;如果结点没有右子树,有父结点,则一直向上查询在父结点左子树的结点;如果是最右结点,即中序遍历最后一个,则下一个结点为空。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(!pNode) return pNode;
if(pNode->right){//第一种情况,有右子树
pNode=pNode->right;
while(pNode->left)
pNode=pNode->left;
return pNode;
}
while(pNode->next){//第二种情况,没有右子树,向上查询
TreeLinkNode* root=pNode->next;
if(root->left==pNode)
return root;
pNode=pNode->next;
}
return NULL;//第三种情况,是最后的结点
}
};
对称的二叉树
描述:给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足 0≤n≤10000 ,节点上的值满足 ∣val∣≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
思路:将一棵树分为左子树和右子树,观察左子树和右子树的左右递归是否相同。如果满足对称二叉树,则一定满足三点:
1. L->val == R->val
2. L->left->val == R->right->val
3. L->right->val == R->left->val
class Solution {
public:
bool issame(TreeNode* root1,TreeNode* root2){
if(!root1&&!root2) return true;
if(!root1||!root2) return false;
return issame(root1->left,root2->right)&&issame(root1->right,root2->left)&&root1->val==root2->val;
}
bool isSymmetrical(TreeNode* pRoot) {
return issame(pRoot,pRoot);
}
};
打印二叉树的每一层
描述:给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树多行打印层序遍历的结果是
[
[1],
[2,3],
[4,5]
]
数据范围:二叉树的节点数 0≤n≤10000,0≤val≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
思路:层次遍历结合确定层次遍历的层次的代码
class Solution {
public:
vector<vector<int> > result;
vector<vector<int> > Print(TreeNode* pRoot) {
if(!pRoot) return result;
queue<TreeNode*> q;
q.push(pRoot);
while(!q.empty()){
int sz=q.size();
vector<int> line;
while(sz--){//每一层
TreeNode* tmp=q.front();
line.push_back(tmp->val);
q.pop();
if(tmp->left){
q.push(tmp->left);
}
if(tmp->right){
q.push(tmp->right);
}
}
result.push_back(line);
}
return result;
}
};