二叉树常见的算法题
Posted 榣山下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树常见的算法题相关的知识,希望对你有一定的参考价值。
二叉树常见的算法题
总算把你给盼来了
现在才关注我 确实是晚了点
但没关系 来了就好
工具:vs code
操作系统:Linux
二叉树常见的算法题目有求树的高度、表达式的遍历、叶子节点的个数、二叉树节点之和、二叉树第k层的节点个数、二棵树的异同……
树的高度
这道题的思想很简单,一棵树的最大深度,左子树和右子树的最大深度+1即可,使用递归,截止条件判断好了,很容易就能够做出来。
//求树的高度
/* *
*
* Height = max(Hl,HR)+1;
*
* */
int BinTree::maxDepth(const binaryTreeNode*root)
{
int max,HL,HR;
if(!root) return 0;
HL=maxDepth(root->Left);
HR=maxDepth(root->Right);
max=HL>HR?HL:HR;
return max+1;
}
叶子节点的个数
求叶子节点的个数,就是左子树叶子节点+右子树叶子节点之和,使用递归即可。
bool BinTree::leafNode(const binaryTreeNode*root)
{
if(!root) return false;
if(!root->Left&&!root->Right) return false;
return leafNode(root->Left)+leafNode(root->Right);
}
二叉树节点之和
/*
*二叉树结点之和
*若根结点为空,返回false;否则,递归左右子树之和+1;
*/
bool BinTree::binNodeSum(const binaryTreeNode*root)
{
if(!root) return false;
return binNodeSum(root->Left)+binNodeSum(root->Right)+1;
}
二叉树第k层的节点个数
/*
* 二叉树中的第k层节点个数
*/
bool BinTree::binNodeSumk(const binaryTreeNode*root,int k)
{
if(!root) return false;
if(k==1) return 1;
return binNodeSumk(root->Left,k-1)+(root->Right,k-1);
}
二棵树的异同
结构相同,根相同,则它们才是相同。
时间复杂度:0(n),其中n是树的结点
空间复杂度:最优情况:0(logn) 最坏情况:0(n)
//两棵树的异同
//结构相同,根相同,则它们才是相同
/*
*time:0(n)->其中n是树的结点
*kong:优:0(logn) 坏:0(n)
*/
bool BinTree::isSameTree(const binaryTreeNode*b1,binaryTreeNode*b2)
{
if(!b1&&!b2) return true;
else if (!b1||!b2) return false;
else if (b1->data!=b2->data) return false;
return isSameTree(b1->Left,b2->Left)&&(b1->Right,b2->Right);
}
表达式的遍历
以下图为例,在例1.1中表达式树的根结点是操作符,左右孩子结点是操作数。 在1.2中的表达式是中序遍历递归出来的,如“+* ba+ cd”是前序遍历递归出来的。
缺点,中序遍历可能会受操作符优先级的影响,导致有不确定性。
解决问题:加括号解决符号的优先级。
//表达式
template<class T>
class binaryTreeNode
{
public: /* data */
T data;
binaryTreeNode*Left,*Right;
binaryTreeNode(T data,binaryTreeNode*left,binaryTreeNode*right)
{
this->data=data;
this->Left=left;
this->Right=right;
}
};
template<class T>
class BinTree
{
private:
//外部接口区
binaryTreeNode<T>*root; //根结点
void create(binaryTreeNode<T>*&root); //先序构建二叉树
void InOrder(const binaryTreeNode<T>*root); //中序遍历
void levelTraversal(binaryTreeNode<T>*root); //层序遍历
public:
//main()函数调用区
BinTree(){};
~BinTree(){};
void createTree(){create(root);};
void InOrderTree(){InOrder(root);} //调用中序遍历
void levelTraversal(){levelTraversal(root);}; //调用层序遍历
};
template<class T>
void BinTree<T>::create(binaryTreeNode<T>*&root)
{
T data;
cin>>data;
if(data=='#') root=NULL;
else
{
root=new binaryTreeNode<T>(data,NULL,NULL);
create(root->Left);
create(root->Right);
}
}
template<class T>
void BinTree<T>::InOrder(const binaryTreeNode<T>*root)
{
if(root!=NULL)
{ //cout<<'(';
InOrder(root->Left); //中序遍历左子树
cout<<root->data<<" "; //访问树根
InOrder(root->Right); //中序遍历右子树
//cout<<')';
}
}
template<class T>
void BinTree<T>::levelTraversal(binaryTreeNode<T>*root)
{
queue<binaryTreeNode<T>*>q;
if(root==NULL) return; //若结点为空时,返回结束;否则,结点进队列。
q.push(root);
while (!q.empty()) //当队列不为空时(树不空),申请一个结点x获取队头,然后根结点出,左右孩子进;
{
binaryTreeNode<T>*x=q.front();
cout<<x->data<<" ";
q.pop();
if(x->Left) //若遍历到左孩子时,左孩子入队列
q.push(x->Left);
if(x->Right)
q.push(x->Right);
}
}
int main()
{
BinTree<char>B;
cout<<"输入表达式:"<<endl;
B.createTree();
cout<<"中序遍历递归表达式"<<endl;
B.InOrderTree();cout<<endl;
cout<<"层序遍历表达式"<<endl;
B.levelTraversal();cout<<endl;
system("pause");
return 0;
}
往期回顾 :
<>
<>
侵删致歉
转载需经同意并引用出处
以上是关于二叉树常见的算法题的主要内容,如果未能解决你的问题,请参考以下文章