2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
वृक्षः कअरेखीय एकः दत्तांशसंरचना, यः n (n>=0) सीमितनोड्स् इत्यनेन निर्मितस्य श्रेणीबद्धसम्बन्धानां समुच्चयः अस्ति ।पोटलिकाउल्टा वृक्षः इव दृश्यते इति कारणतः वृक्षः इति उच्यते, यस्य अर्थः अस्ति यत् अस्य मूलं उपरि दर्शयति, पत्राणि अधः दर्शयन्ति ।
- मूलनोड् : मूलनोड् इत्यस्य पूर्ववर्ती नोड् नास्ति ।
- मूलग्रन्थिं विहाय शेषग्रन्थिः वृक्षसदृशसंरचनायुक्तेषु उपवृक्षेषु विभक्ताः भवन्ति । प्रत्येकस्य उपवृक्षस्य मूलनोड् एकः एव पूर्ववर्ती भवति, तथा च 0 वा अधिकाः उत्तराधिकारिणः भवितुम् अर्हन्ति ।
- तेन वृक्षःपुनरावर्तनीय परिभाषाइत्यस्य।
वृक्षसंरचना रेखीयसारणीयाः अपेक्षया अधिका जटिला भवति, तस्य संग्रहणं प्रतिनिधित्वं च अधिकं कष्टप्रदं भवति ।मूल्यपरिधिः, नोड्-नोड्-योः सम्बन्धः च रक्षितुं आवश्यकम् ।, वस्तुतः वृक्षाणां प्रतिनिधित्वस्य अनेकाः उपायाः सन्ति, यथा-मातापितृसंकेतनं, बालसंकेतनं, बालमातापितृसंकेतनं तथा बालभ्रातृसंकेतनम्प्रतीक्षतु।
निम्नलिखितभण्डारणसंरचनायाः परिचयस्य प्रक्रियायां वयं निम्नलिखितवृक्षं उदाहरणरूपेण गृह्णामः ।
वृक्षस्य नोड्स् निरन्तरस्थानसमूहे, तस्मिन् एव काले च संगृहीताः इति वयं कल्पयामःप्रत्येकं नोड् मध्ये, लिङ्क्ड् सूचीयां तस्य मातापितृनोड् इत्यस्य स्थानं सूचयितुं एकः सूचकः संलग्नः भवति । . अन्येषु शब्देषु, कोऽस्ति इति ज्ञातुं अतिरिक्तं प्रत्येकं नोडः अपि जानाति यत् तस्य मातापितरौ कुत्र सन्ति ।
तेषु दत्तांशः दत्तांशक्षेत्रं भवति, यत् नोडस्य दत्तांशसूचनाः संगृह्णाति । तथा च parent एकं pointer field अस्ति यत् node इत्यस्य parents इत्यस्य subscripts इत्येतत् array मध्ये संगृह्णाति ।
अस्माकं मातापितृप्रतिनिधित्वस्य कृते नोडसंरचनापरिभाषासङ्केतः निम्नलिखितम् अस्ति ।
/*树的双亲表示法结点结构定义*/
#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;
एतादृशेन भण्डारणसंरचनेन वयं The used इत्यस्य parent pointer इत्यस्य अनुसारं तस्य parent nodes इत्येतत् सहजतया अन्वेष्टुं शक्नुमःसमयजटिलता ०(१) अस्ति । , यावत् मातापिता -1 न भवति, वृक्षस्य नोडस्य मूलं प्राप्तम् इति सूचयति । परन्तु यदि वयं ज्ञातुम् इच्छामः यत् नोड् इत्यस्य बालकाः के सन्ति तर्हि क्षम्यतां, कृपया सम्पूर्णं संरचनां भ्रमन्तु ।
अधुना एव वयं वृक्षस्य भण्डारणसंरचनायाः मातापितृणां दृष्ट्या बालस्य च दृष्ट्या अध्ययनं कृतवन्तः यत् यदि वयं वृक्षस्य ग्रन्थिभ्रातरं पश्यामः तर्हि अवश्यं वृक्षसदृशस्य श्रेणीबद्धसंरचनायाः कृते वयं केवलं अध्ययनं कुर्मः brothers of the nodes. अतः वयं द्वौ सूचकौ सेट् कुर्मः, नोड् इत्यस्य प्रथमं बालकं नोड् इत्यस्य दक्षिणभ्रातुः च दर्शयामः ।
/*树的孩子兄弟表示法结构定义*/
typedef struct TreeNode
{
TElemtype data;
struct TreeNode *firstchild, *rightsib;
} TreeNode,* pTreeNode;
द्विचक्रीयवृक्षः नोड्स् इत्यस्य परिमितसमूहः भवति, यः अस्ति :
- शून्यं वा
- अस्मिन् मूलग्रन्थिः प्लस् द्वौ द्विचक्रीयवृक्षौ भवतः, ये वाम उपवृक्षः दक्षिण उपवृक्षः च इति अपि ज्ञायते ।
यथा उपरि चित्रात् दृश्यते- १.
- द्विचक्रीयवृक्षे २ इत्यस्मात् अधिका डिग्रीयुक्तः नोडः नास्ति
- द्विचक्रीयवृक्षस्य उपवृक्षाः वामदक्षिणउपवृक्षयोः विभक्तुं शक्यन्ते, क्रमः च विपर्ययः कर्तुं न शक्यते, अतः द्विचक्रीयवृक्षः अस्तिआदेशितः वृक्षः
नोटः- कोऽपि द्विचक्रीयवृक्षः निम्नलिखितपरिस्थितिभिः निर्मितः भवति ।
द्विचक्रीयवृक्षाणां संग्रहणं सामान्यतया द्वयोः संरचनायोः उपयोगेन कर्तुं शक्यते ।क्रमिकसंरचना, श्रृङ्खलासंरचना।
साधारणाः द्विचक्रीयवृक्षाः सरणीषु भण्डारणार्थं न उपयुक्ताः यतः तत्र बहु अपव्ययः स्थानं भवितुम् अर्हति ।तथाक्रमिकसंरचनाभण्डारणार्थं सम्पूर्णाः द्विचक्रीयवृक्षाः अधिकं उपयुक्ताः भवन्ति .यथार्थतः वयं प्रायःराशौ (द्विचक्रीयवृक्षः) संग्रहणार्थं क्रमिकसंरचनानां सरणीं उपयुङ्क्ते, अत्रत्याः राशौ, प्रचालनतन्त्रस्य आभासीप्रक्रियासङ्केतस्थाने च राशौ भिन्नौ वस्तूनि सन्ति, एकं दत्तांशसंरचना, अपरं च क्षेत्रविभाजनं यत् प्रचालनतन्त्रे स्मृतिं प्रबन्धयति
विशिष्टकार्यन्वयनार्थं अनुप्रयोगाय च कृपया पश्यन्तु :[Data Structure] 08. ढेरः तथा ढेरः अनुप्रयोगाः
द्विचक्रीयवृक्षसंरचना ज्ञातुं सरलतमः उपायः तस्य पारगमनम् अस्ति ।तथाकथितद्विचक्रीयवृक्षपरिभ्रमणं (Traversal) द्विचक्रीयवृक्षे नोड्स् इत्यत्र कतिपयनियमानुसारं क्रमेण तदनुरूपं कार्यं कर्तुं भवति, प्रत्येकं नोडं केवलं एकवारं संचालितं भवति . नोड्-अभिगमनेन क्रियमाणानि कार्याणि विशिष्ट-अनुप्रयोग-समस्यायाः उपरि निर्भरं भवन्ति । द्विचक्रीयवृक्षे ट्रैवर्सल् इति महत्त्वपूर्णेषु कार्येषु अन्यतमम् अस्ति तथा च द्विचक्रीयवृक्षे अन्येषां क्रियाणां आधारः अपि अस्ति ।
//根 左子树 右子树
void PrevOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%d ", root->val);
PrevOrder(root->left);
PrevOrder(root->right);
}
अधोलिखिते चित्रे पुनरावर्तनीयप्रक्रिया दर्शिता अस्ति : १.
//左子树 根 右子树
void InOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
InOrder(root->left);
printf("%d ", root->val);
InOrder(root->right);
}
पुनरावर्तनीयप्रक्रिया निम्नलिखितम् अस्ति ।
//左子树 右子树 根
void PostOrder(pTreeNode root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%d ", root->val);
}
पुनरावर्तनीयप्रक्रिया निम्नलिखितम् अस्ति ।
स्तर-क्रम-भ्रमणम् : पूर्व-क्रम-परिभ्रमणं, क्रम-अन्तर्गत-अनुक्रमणं, क्रम-उत्तर-भ्रमणं च इत्येतयोः अतिरिक्तं द्विचक्रीयवृक्षेषु स्तर-क्रम-परिभ्रमणं अपि कर्तुं शक्यते द्विचक्रीयवृक्षस्य मूलनोड् इत्यस्य स्तरसङ्ख्या 1 इति कल्पयतु ।स्तर-क्रमस्य पारगमनं द्विचक्रीयवृक्षस्य मूलनोड् तः आरभ्यते प्रथमं प्रथमस्तरस्य मूलनोडं गच्छति, ततः द्वितीयस्तरस्य नोड्स् भ्रमति वामतः दक्षिणपर्यन्तं स्तरः, ततः तृतीयस्तरः, स्तरस्य ग्रन्थिः इत्यादयः ।वृक्षस्य ग्रन्थिषु स्तरतः उपरितः अधः यावत् वामतः दक्षिणतः च गमनस्य प्रक्रिया स्तरक्रमपरिभ्रमणम् अस्ति ।。
दृष्टान्तः : १.
अत्र वयं द्विचक्रीयवृक्षस्य पूर्वक्रमपरिभ्रमणं कर्तुं पङ्क्तौ हस्तक्षेपं कुर्मः ।
// 层序遍历
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);
}
द्विचक्रीयवृक्षं निर्मातुं नाशयितुं च वयं उपयुञ्ज्महेद्विचक्रीय वृक्षभ्रमणम्उदाहरणतया।
//二叉树的创建
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);
}
निम्नलिखितक्रियाः सर्वाणि भ्रमणविचारेन सह क्रियन्ते ।
// 二叉树节点个数
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;
}