二叉树面试总结

本文总结了二叉树在面试中的常见问题,包括递归遍历二叉树的前序和中序方法,以及如何根据前序和中序序列重建二叉树。此外,还探讨了如何求解二叉树中节点的最大距离,强调最大距离的计算策略涉及左、右子树及根节点之间的关系。
摘要由CSDN通过智能技术生成

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);
}


8.判断是否为树的子结构


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值