http://blog.csdn.net/beitiandijun/article/details/42030399
http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
1.二叉树的遍历,递归
前序遍历
void preorderTraversal(TreeNode *root){
if(!root)
return;
cout<<root->val<<' ';
preorderTraversal(root->left);
preorderTraversal(root->right);
}
中序遍历
void inorderTraversal(TreeNode *root){
if(!root)
return;
inorderTraversal(root->left);
cout<<root->val<<' ';
inorderTraversal(root->right);
}
后序遍历
void postorderTraversal(TreeNode *root) {
if(!root)
return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout<<root->val<<' ';
}
2 .层序遍历
void levelorderTraverse(TreeNode *root){
if(!root)
return;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* p=q.front();
q.pop();
cout<<p->val<<' ';
if(p->left)
q.push(p->left);
if(p->right)
q.push(p->right);
}
}
3.重建二叉树
前序+中序序列
TreeNode* rebuild_pre(int pre[],int in[],int n){
if(n<=0 || pre==0 || in==0)
return 0;
TreeNode* p=new TreeNode(pre[0]);
int i;
for(i=0;i<n;++i)
if(in[i]==pre[0])
break;
p->left=rebuild_pre(pre+1,in,i);
p->right=rebuild_pre(pre+i+1,in+i+1,n-i-1);
return p;
}
后序+中序序列
TreeNode *rebuild_post(int in[],int post[],int n){
if(n<=0 || post==0 || in==0)
return 0;
TreeNode* p=new TreeNode(post[n-1]);
int i;
for(i=0;i<n;++i)
if(in[i]==post[n-1])
break;
p->left=rebuild_post(in,post,i);
p->right=rebuild_post(in+i+1,post+i,n-i-1);
return p;
}
4.二叉树的深度,记只有一个根节点的树的深度为1.
int TreeDepth(TreeNode* root){
if(!root)
return 0;
return TreeDepth(root->left)>TreeDepth(root->right)?TreeDepth(root->left)+1:TreeDepth(root->right)+1;
}
5.判断一颗二叉树是否平衡
bool IsBalanced(TreeNode* root){
if(!root)
return true; //空节点时也是平衡的
int difference=TreeDepth(root->left)-TreeDepth(root->right);
if(difference>1 || difference<-1)
return false;
else
return (IsBalanced(root->left)&&IsBalanced(root->right));
}
6.二叉树的镜像
void Mirror(TreeNode* root){
if(!root || (!(root->left)&&!(root->right)))
return;
TreeNode* p=root->left;
root->left=root->right;
root->right=p;
Mirror(root->left);
Mirror(root->right);
}
7.二叉树中和为某一值得路径
void Path(TreeNode* root, int s, vector<int> &path, int &sum){
if(!root)
return;
path.push_back(root->val);
sum+=root->val;
if(sum==s && (!(root->left) && !(root->right)))
for(int i=0;i<path.size();++i)
cout<<path[i];
Path(root->left, s,path,sum);
Path(root->right, s,path,sum);
path.pop_back();
sum-=root->val;
}
void FindPath(TreeNode* root, int s){
vector<int> path;
int sum=0;
Path(root, s, path, sum);
}
bool f(TreeNode* root1, TreeNode* root2){
if(!root2)
return true;
if(!root1)
return false;
if(root1->val!=root2->val)
return false;
else
return f(root1->left,root2->left)&&f(root1->right,root2->right);
}
bool HasSubtree(TreeNode* root1, TreeNode* root2){
if(!root1 || !root2)
return false;
bool result;
if(root1->val==root2->val)
result=f(root1,root2);
if(result)
return true;
else
return HasSubtree(root1->left,root2) || HasSubtree(root1->right,root2);
}
9.二叉树中节点的个数
int NodeNum(TreeNode* root){
if(!root)
return 0;
return (NodeNum(root->left)+NodeNum(root->right)+1);
}
10. 判断一个节点是否在二叉树上
bool IsInTree(TreeNode* root, TreeNode* p){
if(!root || !p)
return false;
if(root==p)
return true;
else
return (IsInTree(root->left, p)|| IsInTree(root->right, p));
}
11.求二叉树中俩个节点的最低公共祖先
TreeNode* GetLastCommonParent(TreeNode* root, TreeNode* p1, TreeNode* p2){
if((IsInTree(root->left,p1) && IsInTree(root->right,p2))|| (IsInTree(root->right,p1) && IsInTree(root->left,p2)))
return root;
if(IsInTree(root->left,p1) && IsInTree(root->left,p2))
return GetLastCommonParent(root->left, p1, p2);
if(IsInTree(root->right,p1) && IsInTree(root->right,p2))
return GetLastCommonParent(root->right, p1, p2);
}
12 .求二叉树中节点的最大距离
注:树中的最大距离等于:1)左子树中的最大距离;2)右子树中的最大距离;3)左子树中节点到根节点的最大距离+右子树中节点到根节点的最大距离,这三者中的最大值。
int GetMaxDistance(TreeNode * root, int & maxdepleft, int & maxdepright){ //这个函数相当于有3个返回值,树的最大距离,根节点左子树的深度(左子树中节点到根节点的最大距离),根节点右子树的深度
if(!root){
maxdepleft=0;
maxdepright=0;
return 0;
}
int maxdisleft, maxdisright,maxdepll, maxdeplr,maxdeprl, maxdeprr;
if(root->left){
maxdisleft=GetMaxDistance(root->left, maxdepll, maxdeplr);
maxdepleft=max(maxdepll, maxdeplr)+1;
}
else{
maxdisleft=0;
maxdepleft=0;
}
if(root->right){
maxdisright=GetMaxDistance(root->right, maxdeprl, maxdeprr);
maxdepright=max(maxdeprl, maxdeprr)+1;
}
else{
maxdisright=0;
maxdepright=0;
}
return max(max(maxdisleft,maxdisright),(maxdepleft+maxdepright));
}
int MaxDistanceInTree(TreeNode* root){
if(!root)
return 0;
int maxdepleft, maxdepright;
return GetMaxDistance(root,maxdepleft,maxdepright);
}
13.二叉树中k层节点数
int GetNodeNumKthLevel(TreeNode * root, int k){
if(!root || k<1)
return 0;
if(k==1)
return 1;
return GetNodeNumKthLevel(root->left, k-1)+GetNodeNumKthLevel(root->right, k-1);
}
14.二叉树中叶子节点的个数
int GetLeafNodeNum(TreeNode * root){
if(!root)
return 0;
if((!root->left)&&(!root->right))
return 1;
int leftnum=0, rightnum=0;
if(root->left)
leftnum=GetLeafNodeNum(root->left);
if(root->right)
rightnum=GetLeafNodeNum(root->right);
return leftnum+rightnum;
}
补充: http://blog.csdn.net/yangqiang387393/article/details/51384181