2011 866数据结构 算法设计——二叉树,队列,二叉排序树
二叉树查找节点dfs
#include <bits/stdc++.h>
using namespace std;
typedef struct TreeNode{int data;struct TreeNode *left,*right;
}TreeNode;
TreeNode* init(){int n;cin>>n;vector<TreeNode*> pos(n+1);for (int i=1;i<=n;i++){TreeNode *res=(TreeNode*)malloc(sizeof(TreeNode));res->data=i;res->left=res->right=NULL;pos[i]=res;}for (int i=1;i<=n;i++){int ls,rs,val;cin>>val>>ls>>rs;pos[i]->data=val;if (ls>0){pos[i]->left=pos[ls];}if (rs>0){pos[i]->right=pos[rs];}}return pos[1];
}
bool dfs(TreeNode* rt,int key,int length){if (rt==NULL||length<0) return false;if (length==0&&rt->data==key) return true;return dfs(rt->left,key,length-1)|dfs(rt->right,key,length-1);
}
int main(){TreeNode* rt=init();int key,length;cin>>key>>length;cout<<dfs(rt,key,length)<<"\n";return 0;
}
循环链表模拟队列
#include <bits/stdc++.h>
using namespace std;
typedef struct Node{int data;struct Node *next;
}Node,*LinkList;
void output(LinkList L){Node* p=L->next->next;while (p!=L->next){cout<<p->data<<" ";p=p->next;}cout<<"\n";
}
//带头节点 Q为尾指针
void push(LinkList &Q,int x){Node* res=(Node*)malloc(sizeof(Node));res->data=x;res->next=Q->next;Q->next=res;Q=res;
}
bool pop(LinkList &Q,int &x){if (Q->next==Q) return false;Node* p=Q->next;x=p->next->data;p->next=p->next->next;if (p->next==p){Q=p;}return true;
}
int main(){LinkList Q=(Node*)malloc(sizeof(Node));Q->next=Q;int m;cin>>m;for (int i=1;i<=m;i++){int opt,x;cin>>opt;if (opt==1){cin>>x;push(Q,x);cout<<x<<" push:";output(Q);}else{pop(Q,x);cout<<x<<" pop:";output(Q);}}return 0;
}
二叉排序树的判定
1.dfs中序遍历/栈模拟递归 记录前缀(全局变量或指针传递,以下为指针传递)
#include <bits/stdc++.h>
using namespace std;
typedef struct TreeNode{int data;struct TreeNode *left,*right;
}TreeNode;
TreeNode* init(){int n;cin>>n;vector<TreeNode*> pos(n+1);for (int i=1;i<=n;i++){TreeNode *res=(TreeNode*)malloc(sizeof(TreeNode));res->data=i;res->left=res->right=NULL;pos[i]=res;}for (int i=1;i<=n;i++){int val,ls,rs;cin>>val>>ls>>rs;pos[i]->data=val;if (ls>0){pos[i]->left=pos[ls];}if (rs>0){pos[i]->right=pos[rs];}}return pos[1];
}
const int inf=1e9;
bool dfs(TreeNode *rt,int &pre){if (rt==NULL)return true;if (!dfs(rt->left,pre)||pre>rt->data){return false;}pre=rt->data;return dfs(rt->right,pre);
}
int main(){TreeNode* rt=init();int x=-inf;cout<<dfs(rt,x);return 0;
}
2.树上dp维护子树最大最小值
#include <bits/stdc++.h>
using namespace std;
typedef struct TreeNode{int data;struct TreeNode *left,*right;
}TreeNode;
TreeNode* init(){int n;cin>>n;vector<TreeNode*> pos(n+1);for (int i=1;i<=n;i++){TreeNode *res=(TreeNode*)malloc(sizeof(TreeNode));res->data=i;res->left=res->right=NULL;pos[i]=res;}for (int i=1;i<=n;i++){int val,ls,rs;cin>>val>>ls>>rs;pos[i]->data=val;if (ls>0){pos[i]->left=pos[ls];}if (rs>0){pos[i]->right=pos[rs];}}return pos[1];
}
struct sz{bool flag;int maxn,minn;
};
sz chsum(sz x,sz y){x.flag&=y.flag;x.maxn=max(x.maxn,y.maxn);x.minn=min(x.minn,y.minn);return x;
}
const int inf=1e9+1;
sz dfs(TreeNode *rt){if (rt==NULL)return sz{1,-inf,inf};sz resl=dfs(rt->left),resr=dfs(rt->right),res;res=chsum(resl,resr);res.minn=min(res.minn,rt->data);res.maxn=max(res.maxn,rt->data);if (rt->data<resl.maxn||rt->data>=resr.minn){res.flag=0;}return res;
}
int main(){TreeNode* rt=init();cout<<dfs(rt).flag;return 0;
}