说来惭愧,2018年9月PAT甲级最后一题就是建树然后LCA 自己那个时候LCA不知道怎么写。。。。已经过了一年了
现在也不会写哈哈哈哈
目前考研 树的那块要学 默默的掏出我的小电脑开始学呜呜呜 这个故事告诉我们不要瞎偷懒 出来混迟早都是要还的
递归代码:
//结构体
struct node
{
int val;
node *left;
node *right;
};
//查找最近公共祖先
node *LCA(node *root, int u, int v) {
if (root == NULL)
return NULL; //树为空 返回NULL当然没有公共祖先
if (root->val == u || root->val == v)
return root;
/*
*其中一个数就是root->data 那么直接返回root 另外一个数有两种情况
*1.在后代中 那么一定就是root
*2.不在该树中 那么root中只有一个数 返回root
*/
node *left = LCA(root->left, u, v);
node *right = LCA(root->right, u, v);
if (left && right )
return root; //u v分别位于左右子树的情况都找到了
if(left)
return left; //u v 分布在左侧
if(right)
return right; //u v 分布在右侧
return NULL;
}
对于一个满二叉树 调换他的先序和后序
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void PreToPost(int pre[], int prl, int prr,int post[], int pol, int por)
{
if(prr < prl || por < pol)
return ;
post[por] = pre[prl];
int half = (prr - prl) / 2;
PreToPost(pre, prl + 1, prl + half, post, pol, pol + half - 1);
PreToPost(pre, prl + half + 1, prr, post, pol + half, por - 1);
return ;
}
using namespace std;
int main()
{
int pre[10] = {0,1,2,3,4,5,6,7,8,9};
int post[10];
PreToPost(pre, 1, 7, post, 1, 7);
for(int i = 1; i <= 7; i ++)
printf("%d%c",post[i]," \n"[i==7]);
return 0;
}
将叶子节点的连接起来
LinkedList head = NULL ,pre = NULL;
LinkedList Inorder(BiTree bt)
{
if(bt)
{
Inorder(bt->left);
if(bt->left == NULL && bt->right == NULL)
{
if(head == NULL)
{
head = bt;
pre = bt;
}else
{
pre->right = bt;
pre = bt;
}
}
Inorder(bt->right);
pre->right = NULL;
}
return head;
}
判断两个子树是否相同
bool is_Same(Bitree a, Bitree b)
{
if(a == NULL && b == NULL)
return true;
if(a == NULL && b != NULL || a != NULL && b == NULL )
return false;
if(is_Same(a->left,b->left) && is_Same(a->right, b->right))
return true;
}
表达式树转换成中缀表示式
void Bitree(Bitree *root, int deep)
{
if(root == NULL)
return ;
else if(root->left == NULL && root->right == NULL)
printf("%s",root->data);
else
{
if(deep > 1)
printf("(");
Bitree(root->left, deep + 1);
printf("%s",root->data);
Bitree(root->right, deep + 1);
if(deep > 1)
printf(")");
}
}
表达式的分支对应子表达式的计算次数 有该分支节点所处的位置决定
为了得到正确的中缀表达式 需要在生成遍历树的同时 在适当位置添加必要的括号 显然 表达式最外层 对应根节点 和操作数不需要添加括号
本质上是那些运算符添加符号 这边自己似乎以前就一直没好好搞懂