2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
lignum est anonlinear Data structura, quae est ordo relationum hierarchicarum ex n (n>=0) compositarum nodi limitatorum.FasciculusDicitur arbor, quia apparet sicut arbor inversi, quod significat radices sursum et folia monstrantia.
- Radix nodi: Radix nodi nodus praedecessoris non habet.
- Praeter nodi radicem, reliqui nodi in subtres dividuntur structura simili cum arbore. Nodus radicis uniuscuiusque subtrei unum et unicum praedecessorem habet, et 0 vel plures successores habere potest.
- Ergo arbor estrecursive definitionof.
Structura ligni magis complicata quam mensae linearis, et molestius condere ac repraesentare.Necesse est ut tam valoris ambitus quam relatio inter nodi et nodos servetur.re vera multae viae ad repraesentandum arbores, ut;Parentis notatio, puer notatio, puer notatio parens et puer frater notatiomanere.
In processu introducendi sequentem structuram repositionis, exemplum sequentis arboris accipimus.
Ponamus nodos arboris in stato spatiorum continuorum et simul repositorumIn unaquaque nodo index adnectitur ad indicandam positionem nodi parentis sui in indice coniuncto. . Id est, praeter scire quis sit, nodus quisque etiam novit ubi sunt parentes ejus.
Inter eos, notitia campi notitia, quae notitias nodi addit. Et parens campus monstrator est qui subscripta nodo parentes in acie reponit.
Sequens est structura nodi definitio codicis pro parente nostro repraesentatio.
/*树的双亲表示法结点结构定义*/
#define MAX_TREE_SIZE 100
typedef int TElemType; //树结点的数据类型,目前暂定为整型
/*结点结构*/
typedef struct TreeNode
{
TElemType data; //结点数据
int parent; //双亲位置
}TreeNode;
/*树结构*/
typedef struct
{
TreeNode nodes[MAX_TREE_SIZE]; //结点数组
int r, n; //根的位置和结点数
}PTree;
Cum tali structurae repositione, facile possumus nodos parentis eius invenire secundum regulam parentis nodiTempus complexionem 0 (I) donec parens -1 sit, radicem arboris nodi inventam significans. Sed si scire velimus quid filii nodi sint, doleo, quaeso, totam structuram percurrere.
Modo studuimus structuram repositam arboris e prospectu parentum et prospectum pueri Fratres Nodorum. Non est possibile. Post considerationem, invenimus quod in qualibet arbore, primus filius nodi est singularis si existit, et frater eius ius est etiam unicus si est. Ponimus ergo duas regulas demonstrantes primo prolem nodi et dextrum nodi fratrem.
/*树的孩子兄弟表示法结构定义*/
typedef struct TreeNode
{
TElemtype data;
struct TreeNode *firstchild, *rightsib;
} TreeNode,* pTreeNode;
Binaria arbor est nodorum finita, quae est;
- aut vacua
- Constat nodi radicis plus duabus arboribus binariis, quae etiam laeva subtree et dextra subtree sunt.
Ut videri potest ex pictura supra;
- Nulla nodi cum gradu maior quam 2 in ligno binario
- Subtres arboris binariae dividi possunt in subtrees dextra et dextra, et ordo inverti non potest, sic arbor binaria.iussi ligno
Nota: Quaelibet arbor binaria componitur ex his adiunctis;
Arbores binarii plerumque recondi possunt duabus structuris utentes;Sequentia compages, catenae structura.
Ordinariae arbores binariae non sunt aptae ad reponendum in vestitu, quia multum spatii vastati esse possunt.etPlenae arbores binariae aptiores sunt ad structuram sequentialem repositionis .Reapse solemusTumulus (arbor binaria) sequentiae structurae acie utitur ad reponuntnotandum est acervus hic et acervus in processu virtuali electronici spatii systematis operantis duo diversa sunt.
Ad specifica exsecutionem et applicationem, quaeso vide:[Data Structure] 08. Cumulo et cumulo applicationes
Via simplicissima structuram ligni binarii discendi est percurrere.dictusLignum binarium traversale (Traversal) est operationes nodis in arbore binaria in ordine secundum certas regulas respondentes fungi, et uterque nodi semel tantum operatus est. . Operationes per nodos accessiones factae secundum problema applicationis specificae pendent. Traversal una ex maximis operationibus in arbore binaria est etiam fundamentum aliarum operationum in arbore binaria.
//根 左子树 右子树
void PrevOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%d ", root->val);
PrevOrder(root->left);
PrevOrder(root->right);
}
Figura infra ostendit processum recursivum;
//左子树 根 右子树
void InOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
InOrder(root->left);
printf("%d ", root->val);
InOrder(root->right);
}
Hic processus recursivus est:
//左子树 右子树 根
void PostOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%d ", root->val);
}
Hic processus recursivus est:
Ordo traversalis: Praeter ordinem traversalem, in ordinem traversalem, et post ordinem traversalem, ordo traversalis etiam in arboribus binariis fieri potest. Pone gradum nodi radicis arboris binarii numerus est 1. Gradus ordo traversalis incipit a nodo radicis arboris binarii planities a sinistro ad dextrum, et dein tertia;Processus visitandi nodos ligni iacuit a summo ad imum et a sinistro ad dextrum iacuit ordo traversus est.。
Illustratio:
Hic intercedit in queue ad praecellens ordinem traversalis arboris binariae faciendae.
// 层序遍历
void LevelOrder(pTreeNode root)
{
Queue q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
pTreeNode front = QueueFront(&q);
QueuePop(&q);
if (front == NULL)
{
printf("NULL ");
}
else
{
printf("%d ", front->val);
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
}
QueueDestory(&q);
}
Ad creare et destruere arborem binariam, utimurBinarii lignum traversalExempli gratia.
//二叉树的创建
struct TreeNode* Creat(char* arr,int n,int* i)
{
if(*i<n&&arr[*i]=='#')
{
(*i)++;
return NULL;
}
TreeNode* newnode=(TreeNode*)malloc(sizeof(TreeNode));
newnode->left=NULL;
newnode->right=NULL;
newnode->val=arr[(*i)++];
newnode->left=Creat(arr,n,i);
newnode->right=Creat(arr,n,i);
return newnode;
}
//二叉树的销毁
void TreeDestroy(struct TreeNode* root)
{
if(root==NULL)
{
return;
}
TreeDestroy(root->left);
TreeDestroy(root->right);
free(root);
}
Hae operationes omnes per rationem traversalis exercentur.
// 二叉树节点个数
int TreeSize(pTreeNode root)
{
if (root == NULL)
{
return 0;
}
return TreeSize(root->left) + TreeSize(root->right) + 1;
}
// 二叉树叶子节点个数
int TreeLeafSize(pTreeNode root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}
// 二叉树第k层节点个数
int TreeLevelKSize(pTreeNode root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return TreeLevelKSize(root->left, k - 1) + TreeLevelKSize(root->right, k - 1);
}
// 二叉树查找值为x的节点
pTreeNode TreeFind(pTreeNode root, TreeDataType x)
{
if (root == NULL)
{
return NULL;
}
//相等就返回
if (root->val == x)
return root;
//找左子树
pTreeNode left=TreeFind(root->left, x);
if (left)
{
return left;
}
//找右子树
pTreeNode right = TreeFind(root->right, x);
if (right)
{
return right;
}
//都没找到
return NULL;
}
//二叉树的高度
int TreeHeight(pTreeNode root)
{
if (root == NULL)
{
return 0;
}
int max_left = TreeHeight(root->left) ;
int max_right = TreeHeight(root->right);
return max_left > max_right ? max_left + 1 : max_right + 1;
}
//判断是否是完全二叉树
bool TreeComplete(pTreeNode root)
{
Queue q;
QueueInit(&q);
if (root)
{
QueuePush(&q, root);
}
while (!QueueEmpty(&q))
{
pTreeNode front = QueueFront(&q);
QueuePop(&q);
if (front == NULL)
{
break;
}
else
{
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
}
while (!QueueEmpty(&q))
{
pTreeNode front = QueueFront(&q);
QueuePop(&q);
if (front)
{
QueueDestory(&q);
return false;
}
}
QueueDestory(&q);
return true;
}