二叉树相关编程题:
- 对称二叉树:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
1)若是对称二叉树则其是镜像的,若是镜像的,则需要左子树的左子树和右子树的右子树相同,且左子树的右子树和右子树的左子树相同。
2) 基于此思想可以考虑递归求解,左子树的左子树等于右子树的右子树,则意味着除去左右子树的两个“根”节点,其余都相等(等同于一个子问题)。(注意递归算法中不需要用while或for来设置循环)
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL) return true;
if(pRoot->left==NULL && pRoot ->right ==NULL) return true;
int res=isEqual(pRoot,pRoot);
return res;
}
bool isEqual(TreeNode *l, TreeNode *r)
{
if(l==NULL && r==NULL)
return true;
if(l==NULL||r==NULL)
return false;
if(l->val!=r->val)
return false;
int a=isEqual(l->left,r->right);
int b=isEqual(l->right,r->left);
return a&&b;
}
- 之字打印二叉树:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> result;
if(pRoot==nullptr)
return result;
stack<TreeNode*> stack1,stack2;
stack1.push(pRoot);
while(!stack1.empty()||!stack2.empty()){
if(!stack1.empty()){
vector<int> temp;
while(!stack1.empty()){
TreeNode *data=stack1.top();
stack1.pop();
temp.push_back(data->val);
if(data->left!=nullptr)
stack2.push(data->left);
if(data->right!=nullptr)
stack2.push(data->right);
}
result.push_back(temp);
}
if(!stack2.empty()){
vector<int> temp;
while(!stack2.empty()){
TreeNode *data=stack2.top();
stack2.pop();
temp.push_back(data->val);
if(data->right)
stack1.push(data->right);
if(data->left)
stack1.push(data->left);
}
result.push_back(temp);
}
}
return result;
}
};