0
点赞
收藏
分享

微信扫一扫

剑指Offer_编程题( 二叉树的下一个结点 / 对称的二叉树 / 按之字形顺序打印二叉树 / 把二叉树打印成多行)


​​剑指Offer_编程题​​

57、二叉树的下一个结点

时间限制:1秒 空间限制:32768K 热度指数:199096

本题知识点: ​​树​​

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:中序遍历的下一个结点,(可以直接套用之前​​二叉搜索树与双向链表​​就可以找到下一个子节点)不过这道题不一样,他都有父节点指针了,所以我们可以直接根据中序遍历的顺序,直接判断找出答案。1、如果该结点有右结点,则然后从右结点开始找到最底层的左结点。2、没有右结点:(1)判断他是其父节的左结点,直接返回父节点 (2)他是右结点=》①父节点的左结点的右结点,返回父节点 ②父节点右结点的的右结点 返回NULL

/*
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)
{
TreeLinkNode* next;//中序遍历的下一个节点 根节点->右子树的最左节点
TreeLinkNode* p=pNode->right;
if(p==NULL){
p=pNode;
TreeLinkNode *q=p->next;
if(q!=NULL&&q->right==p){
p=p->next;
TreeLinkNode *tmp=p->next;
if(tmp!=NULL&&tmp->left==p) next=tmp;
else next=NULL;
}
else if(q!=NULL&&q->left==p) next=q;
else next=NULL;
}
else{
while(p->left!=NULL){
p=p->left;
}
next=p;
}
return next;
}
};

58、对称的二叉树

时间限制:1秒 空间限制:32768K 热度指数:189006

本题知识点: ​​树​​

题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路:我搞的还挺麻烦的。首先创建该二叉树的镜像,(因为过程中把该二叉树也镜像了)再反镜像。最后一起判断。

class Solution {
public:
TreeNode* Mirror(TreeNode *pRoot) {
queue<TreeNode*> q,fq;
TreeNode *p;
if(pRoot!=NULL){
p=new TreeNode(pRoot->val);
}
q.push(pRoot);
fq.push(p);
while(!q.empty()){
TreeNode *u=q.front();q.pop();
TreeNode *v=fq.front();fq.pop();
if(u==NULL) continue;
TreeNode *left=u->left;
u->left=u->right;
u->right=left;
q.push(u->left);
q.push(u->right);

TreeNode *tmp=u->left;
if(tmp!=NULL) v->left=new TreeNode(tmp->val);
tmp=u->right;
if(tmp!=NULL) v->right=new TreeNode(tmp->val);

fq.push(v->left);
fq.push(v->right);
}
return p;
}

void Mirrors(TreeNode *pRoot) {
queue<TreeNode*> q;
q.push(pRoot);
while(!q.empty()){
TreeNode *u=q.front();q.pop();
if(u==NULL) continue;
TreeNode *left=u->left;
u->left=u->right;
u->right=left;
q.push(u->left);
q.push(u->right);
}
}
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL) return true;
TreeNode *fRoot;
fRoot=Mirror(pRoot);//镜像 fRoot新的
Mirrors(pRoot);//在返回来
//cout<<fRoot->val<<" "<<pRoot->val<<endl;
queue<TreeNode*> q,p;
q.push(fRoot);
p.push(pRoot);
bool flag=true;
while(!q.empty()&&!p.empty()){
TreeNode *u=q.front();q.pop();
TreeNode *v=p.front();p.pop();

if(u==NULL&&v==NULL) continue;
if((u!=NULL&&v==NULL)||(u==NULL&&v!=NULL)) return false;
if(u->val!=v->val) {
return false;
}
//cout<<u->val<<" "<<v->val<<endl;
if(u!=NULL){
q.push(u->left);
q.push(u->right);
}
if(v!=NULL){
p.push(v->left);
p.push(v->right);
}
}
return flag;
}
};

59、按之字形顺序打印二叉树

时间限制:1秒 空间限制:32768K 热度指数:217420

本题知识点: ​​栈​​​ ​​树​​

题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路:没错用栈就好了。还用了一个队列,没办法要返回一层一层的vector。 

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
struct node{
int cnt;
TreeNode *p;
node(int x,TreeNode *y){
cnt=x;p=y;
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
if(pRoot==NULL) return ans;
stack<node> s;
s.push(node(1,pRoot));
while(!s.empty()){
vector<int> v;
queue<node> q;
while(!s.empty()){
node u=s.top();s.pop();
if(u.p==NULL) continue;
if(u.p!=NULL){
v.push_back(u.p->val);
}
if((u.cnt+1)&1){
q.push(node(u.cnt+1,u.p->right));
q.push(node(u.cnt+1,u.p->left));
}
else {
q.push(node(u.cnt+1,u.p->left));
q.push(node(u.cnt+1,u.p->right));
}
}
while(!q.empty()){
s.push(q.front());q.pop();
}
if(v.size()==0) break;
ans.push_back(v);
}
return ans;
}
};

60、把二叉树打印成多行

时间限制:1秒 空间限制:32768K 热度指数:171060

本题知识点: ​​队列​​​ ​​树​​

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路:没错用队列写就好了。上面一题都能搞出来,这一题是没问题的。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
struct node{
int cnt;
TreeNode *p;
node(int x,TreeNode *y){
cnt=x;p=y;
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
if(pRoot==NULL) return ans;
queue<node> s;
s.push(node(1,pRoot));
while(!s.empty()){
vector<int> v;
queue<node> q;
while(!s.empty()){
node u=s.front();s.pop();
if(u.p==NULL) continue;
if(u.p!=NULL){
v.push_back(u.p->val);
}
q.push(node(u.cnt+1,u.p->left));
q.push(node(u.cnt+1,u.p->right));
}
while(!q.empty()){
s.push(q.front());q.pop();
}
if(v.size()==0) break;
ans.push_back(v);
}
return ans;

}
};

 

举报

相关推荐

0 条评论