二叉树的递归算法
将二叉树常见的递归算法罗列如下:
(一)前序/中序/后序遍历
以中序为例:
void inorder(Node* root){ //从根节点的指针开始 if(root!=NULL){ inorder(root->left); cout<data<<" "; inorder(root->right); } }
(二)求二叉树的高度
int maxDepth(Node* root) {//递归查找 Node* p=root; if(p==NULL) return 0; int m=maxDepth(p->left); int n=maxDepth(p->right); int x=m>n? m+1:n+1; return x; }
(三)求二叉树最大的数
int getmax(Node *node){ if(node==NULL){ return -1; } else{ int m1=getmax(node->left); //左子树最大的数 int m2=getmax(node->right); //右子树最大的数 int n=node->data; //根节点的值 int max=n; if(m1>n) { max=m1; } if(m2>n){ max=m2; } return max; } }
(四)求所有最左边叶子结点的和
int sumOfLeftLeaves(TreeNode* root) { if(root==NULL) return 0; int sum=0; //必须有 if(root->left){ if(root->left->left==NULL&&root->left->right==NULL) //叶子结点 sum+=root->left->val; } return sum+sumOfLeftLeaves(root->left)+sumOfLeftLeaves(root->right); }
(五)交换——交换左右子树
要求:
思想:后序遍历实现,从下往上,首先交换b结点左孩子的左右子树,然后交换b结点右孩子的左右子树,最后交换b结点的左右子树。(后序遍历思想)
void swap(Node* root){ if(root){ swap(root->left); swap(root->right); Node* temp=root->left; root->left=root->right; root->right=temp; } }
先序遍历实现,从上到下
Node* invertTree(Node* root) { Node* p=root; if(p!=NULL) { Node* temp=p->left; p->left=p->right; p->right=temp; invertTree(p->left); invertTree(p->right);} return root; }
(六) 计算双支结点(度为2)结点的个数
int Sumnode(Node* root){ Node* p=root; if(p){ if(p->left&&p->right){ return Sumnode(p->left)+Sumnode(p->right)+1; //左+右+根节点 } else{ return Sumnode(p->left)+Sumnode(p->right); //左加右 } } }
(七)判断两个二叉树是否相同
三种情况:
1)两棵树都是空树,则相同
2)一个树空,一个树不空,则不同
3)两个树非空,比较结点的值
bool isSameTree(TreeNode* p, TreeNode* q) {
//可能出现的三种情况,注意是两棵树,即两个参数
if(p==NULL&&q==NULL) return true;
if(p==NULL||q==NULL) return false;
if(p->val!=q->val) return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
(八)合并两棵二叉树
法一:改变输入树的结构,即在树1身上改动,返回树1
Node* merge(Node* root1,Node* root2){ if(root1==NULL) return root2; if(root2==NULL) return root1; root1->data += root2->data; root1->left=merge(root1->left,root2->left); root1->right=merge(root1->right,root2->right); return root1; }
法二:不改变输入树的结构,新建一个树,返回新树
Node* merge(Node* root1,Node* root2){ if(root1==NULL) return root2; if(root2==NULL) return root1; //重新定义一个新的结点 Node* root=new Node(0); root->data= root1->data + root2->data; root->left=merge(root1->left,root2->left); root->right=merge(root1->right,root2->right); return root; }
未完待续...