二叉树常见的算法题

Posted 榣山下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树常见的算法题相关的知识,希望对你有一定的参考价值。


二叉树常见的算法题





总算把你给盼来了

现在才关注我 确实是晚了点

但没关系 来了就好


二叉树常见的算法题


工具:vs code

操作系统:Linux

二叉树常见的算法题

二叉树常见的算法题

二叉树常见的算法题目有求树的高度、表达式的遍历、叶子节点的个数、二叉树节点之和、二叉树第k层的节点个数、二棵树的异同……

二叉树常见的算法题
SUMMER


二叉树常见的算法题


二叉树常见的算法题

树的高度

    这道题的思想很简单,一棵树的最大深度,左子树和右子树的最大深度+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
 /* *二叉树结点之和 *若根结点为空,返回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;}



二叉树常见的算法题
“在看”的小可爱永远十八岁!


二叉树常见的算法题

往期回顾 :

  • <>

  • <>




二叉树常见的算法题



二叉树常见的算法题


部分图片来源网络

侵删致歉



二叉树常见的算法题


转载需经同意并引用出处


二叉树常见的算法题









以上是关于二叉树常见的算法题的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 最常见的前端基础算法面试题汇总

leetcode 最常见的前端基础算法面试题汇总

leetcode 最常见的前端基础算法面试题汇总

leetcode 最常见的前端基础算法面试题汇总

算法总结二叉树常见算法题目及解题思路汇总

算法基础:二叉树的遍历