प्रौद्योगिकी साझेदारी

[दत्तांशसंरचना] 09. वृक्षः द्विचक्रीयवृक्षः च

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. वृक्षस्य अवधारणा संरचना च

१.१ वृक्षस्य अवधारणा

वृक्षः कअरेखीय एकः दत्तांशसंरचना, यः n (n>=0) सीमितनोड्स् इत्यनेन निर्मितस्य श्रेणीबद्धसम्बन्धानां समुच्चयः अस्ति ।पोटलिकाउल्टा वृक्षः इव दृश्यते इति कारणतः वृक्षः इति उच्यते, यस्य अर्थः अस्ति यत् अस्य मूलं उपरि दर्शयति, पत्राणि अधः दर्शयन्ति ।

  • मूलनोड् : मूलनोड् इत्यस्य पूर्ववर्ती नोड् नास्ति ।
  • मूलग्रन्थिं विहाय शेषग्रन्थिः वृक्षसदृशसंरचनायुक्तेषु उपवृक्षेषु विभक्ताः भवन्ति । प्रत्येकस्य उपवृक्षस्य मूलनोड् एकः एव पूर्ववर्ती भवति, तथा च 0 वा अधिकाः उत्तराधिकारिणः भवितुम् अर्हन्ति ।
  • तेन वृक्षःपुनरावर्तनीय परिभाषाइत्यस्य।

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

१.२ वृक्षाणां सम्बद्धाः अवधारणाः

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

  • नोडस्य डिग्री: नोड् मध्ये निहितानाम् उपवृक्षाणां संख्या नोडस्य डिग्री इति उच्यते यथा उपरि चित्रे दर्शितम् अस्ति: A's 4 भवति;
  • पत्रग्रन्थिः अथवा अन्तग्रन्थिः: 0 डिग्री युक्ताः नोड्स् पत्रग्रन्थिः इति उच्यन्ते यथा उपरि चित्रे दर्शितम् : नोड्स B, F, G, D, H च पत्रग्रन्थिः सन्ति ।
  • अ-अन्त-नोडः शाखा-नोडः वा: एकः नोडः यस्य डिग्री 0 नास्ति;
  • मातापितृनोडः अथवा मातापितृनोडः: यदि कस्मिन् अपि नोड् मध्ये बालनोड्स् सन्ति तर्हि एतत् नोड् तस्य बाल नोड् इत्यस्य मातापितृ नोड् इति उच्यते यथा उपरि चित्रे दर्शितम् अस्ति: A B इत्यस्य मातापितृ नोड् अस्ति;
  • बालग्रन्थिः बालग्रन्थिः वा: नोडेन समाविष्टस्य उपवृक्षस्य मूलग्रन्थिः नोडस्य बालग्रन्थिः इति उच्यते यथा उपरि चित्रे दर्शितम् : B A इत्यस्य बालग्रन्थिः अस्ति
  • भ्राता नोडः: समानं मातापितृनोड् युक्ताः नोड्स् सिबलिंग् नोड् इति उच्यन्ते यथा उपरि दर्शितम् : B तथा C सिबिंग् नोड् स्तः;
  • वृक्षस्य डिग्री: वृक्षे बृहत्तमस्य नोडस्य डिग्री वृक्षस्य डिग्री इति उच्यते यथा उपरि दर्शितम् : वृक्षस्य डिग्री ४ भवति;
  • नोड स्तर: मूलस्य परिभाषातः आरभ्य मूलं प्रथमस्तरः, मूलस्य बालनोड्स् द्वितीयस्तरः इत्यादयः;
  • वृक्षस्य ऊर्ध्वता वा गभीरता वा: वृक्षे यथा उपरि दर्शितं तथा नोड्स् इत्यस्य अधिकतमः स्तरः : वृक्षस्य ऊर्ध्वता ३ भवति
  • मातुलः नोडः: येषां नोड्स् मातापितरौ एकस्मिन् स्तरे सन्ति ते परस्परं मातुलभ्रातरः सन्ति यथा उपरि चित्रे दर्शितम् अस्ति : F तथा G परस्परं भ्राता नोड्स् सन्ति;
  • नोडस्य पूर्वजः: मूलतः ग्रन्थिपर्यन्तं शाखासु सर्वे ग्रन्थिः यथा उपरि चित्रे दर्शितम् : A सर्वेषां ग्रन्थिनां पूर्वजः अस्ति;
  • वंशजाः : कस्मिंश्चित् नोडे मूलभूते उपवृक्षे यः कोऽपि नोडः तस्य नोडस्य वंशजः इति उच्यते ।यथा उपरि दर्शितम् : सर्वे ग्रन्थिः A इत्यस्य वंशजाः सन्ति
  • वनः: म विसंयुक्तवृक्षसङ्ग्रहः वनम् इति उच्यते;

१.३ वृक्षप्रतिपादनम्

वृक्षसंरचना रेखीयसारणीयाः अपेक्षया अधिका जटिला भवति, तस्य संग्रहणं प्रतिनिधित्वं च अधिकं कष्टप्रदं भवति ।मूल्यपरिधिः, नोड्-नोड्-योः सम्बन्धः च रक्षितुं आवश्यकम् ।, वस्तुतः वृक्षाणां प्रतिनिधित्वस्य अनेकाः उपायाः सन्ति, यथा-मातापितृसंकेतनं, बालसंकेतनं, बालमातापितृसंकेतनं तथा बालभ्रातृसंकेतनम्प्रतीक्षतु।

निम्नलिखितभण्डारणसंरचनायाः परिचयस्य प्रक्रियायां वयं निम्नलिखितवृक्षं उदाहरणरूपेण गृह्णामः ।अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

१.३.१ मातापितृप्रतिनिधित्वम्

वृक्षस्य नोड्स् निरन्तरस्थानसमूहे, तस्मिन् एव काले च संगृहीताः इति वयं कल्पयामःप्रत्येकं नोड् मध्ये, लिङ्क्ड् सूचीयां तस्य मातापितृनोड् इत्यस्य स्थानं सूचयितुं एकः सूचकः संलग्नः भवति । . अन्येषु शब्देषु, कोऽस्ति इति ज्ञातुं अतिरिक्तं प्रत्येकं नोडः अपि जानाति यत् तस्य मातापितरौ कुत्र सन्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
तेषु दत्तांशः दत्तांशक्षेत्रं भवति, यत् नोडस्य दत्तांशसूचनाः संगृह्णाति । तथा च 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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

एतादृशेन भण्डारणसंरचनेन वयं The used इत्यस्य parent pointer इत्यस्य अनुसारं तस्य parent nodes इत्येतत् सहजतया अन्वेष्टुं शक्नुमःसमयजटिलता ०(१) अस्ति । , यावत् मातापिता -1 न भवति, वृक्षस्य नोडस्य मूलं प्राप्तम् इति सूचयति । परन्तु यदि वयं ज्ञातुम् इच्छामः यत् नोड् इत्यस्य बालकाः के सन्ति तर्हि क्षम्यतां, कृपया सम्पूर्णं संरचनां भ्रमन्तु ।

१.३.२ बालभ्रातृप्रतिनिधित्वम्

अधुना एव वयं वृक्षस्य भण्डारणसंरचनायाः मातापितृणां दृष्ट्या बालस्य च दृष्ट्या अध्ययनं कृतवन्तः यत् यदि वयं वृक्षस्य ग्रन्थिभ्रातरं पश्यामः तर्हि अवश्यं वृक्षसदृशस्य श्रेणीबद्धसंरचनायाः कृते वयं केवलं अध्ययनं कुर्मः brothers of the nodes. अतः वयं द्वौ सूचकौ सेट् कुर्मः, नोड् इत्यस्य प्रथमं बालकं नोड् इत्यस्य दक्षिणभ्रातुः च दर्शयामः ।

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

/*树的孩子兄弟表示法结构定义*/
typedef struct TreeNode
{
	TElemtype data;
	struct TreeNode *firstchild, *rightsib;
} TreeNode,* pTreeNode;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

१.४ वृक्षाणां व्यावहारिकप्रयोगाः

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

2. द्विचक्रीयवृक्षस्य अवधारणा संरचना च

२.१ अवधारणा

द्विचक्रीयवृक्षः नोड्स् इत्यस्य परिमितसमूहः भवति, यः अस्ति :

  • शून्यं वा
  • अस्मिन् मूलग्रन्थिः प्लस् द्वौ द्विचक्रीयवृक्षौ भवतः, ये वाम उपवृक्षः दक्षिण उपवृक्षः च इति अपि ज्ञायते ।

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

यथा उपरि चित्रात् दृश्यते- १.

  1. द्विचक्रीयवृक्षे २ इत्यस्मात् अधिका डिग्रीयुक्तः नोडः नास्ति
  2. द्विचक्रीयवृक्षस्य उपवृक्षाः वामदक्षिणउपवृक्षयोः विभक्तुं शक्यन्ते, क्रमः च विपर्ययः कर्तुं न शक्यते, अतः द्विचक्रीयवृक्षः अस्तिआदेशितः वृक्षः

नोटः- कोऽपि द्विचक्रीयवृक्षः निम्नलिखितपरिस्थितिभिः निर्मितः भवति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

२.२ विशेषद्विविधवृक्षाः

  1. पूर्ण द्विचक्रीय वृक्ष: द्विचक्रिका वृक्षः, २.यदि प्रत्येकस्मिन् स्तरे नोड्-सङ्ख्या अधिकतमं प्राप्नोति तर्हि द्विचक्रीयवृक्षः पूर्णः द्विचक्रीयः वृक्षः भवति । . अर्थात् यदि द्विचक्रीयवृक्षस्य स्तरसङ्ख्या K भवति तथा च नोडानां कुलसंख्या 2^k-1 भवति तर्हि सः पूर्णद्विचक्रीयवृक्षः भवति ।
  2. सम्पूर्ण द्विचक्रीय वृक्ष: सम्पूर्णः द्विचक्रीयः वृक्षः अतीव कुशलः दत्तांशसंरचना अस्ति ।पूर्णद्विचक्रीयवृक्षाः पूर्णद्विचक्रीयवृक्षेभ्यः निष्पन्नाः भवन्ति . K गभीरतायाः n नोड्स् युक्तस्य द्विचक्रीयवृक्षस्य कृते यदि तथा केवलं यदि प्रत्येकं नोडः K गभीरतायाः पूर्णद्विचक्रीयवृक्षे 1 तः n पर्यन्तं सङ्ख्यायुक्तैः ग्रन्थिभिः सह एकैकं सङ्गच्छते चेत् एव सः सम्पूर्णः द्विचक्रीयवृक्षः इति कथ्यते सावधानं भवितुमर्हतिपूर्ण द्विचक्रीयवृक्षः पूर्णद्विचक्रीयवृक्षविशेषः ।
    अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

२.३ द्विचक्रीयवृक्षाणां गुणाः

  1. यदि मूलनोडस्य स्तरसङ्ख्या १ इति निर्दिष्टा भवति तर्हि...i-तमस्तरस्य उपरि अधिकतमं २^(i-१) भवन्ति नोड्स इति
  2. यदि मूलनोडस्य स्तरसङ्ख्या १ इति निर्दिष्टा तर्हिगभीरता h युक्तस्य द्विचक्रीयवृक्षस्य अधिकतमं नोडसङ्ख्या 2^h-1 भवति
  3. कस्यचित् द्विचक्रीयवृक्षस्य कृते यदि0 डिग्री युक्तानां पत्रग्रन्थिनां संख्या n0, 2 डिग्री युक्तानां शाखाग्रन्थिनां संख्या n2, ततः n0=n2 +1
  4. यदि मूलनोडस्य स्तरसङ्ख्या १ इति निर्दिष्टा भवति तर्हि ।n नोड्सयुक्तस्य पूर्णद्विचक्रीयवृक्षस्य गभीरता, h=log (n+1) (ps: log आधारः २, n+1 लघुगणकः)
  5. n नोड्स् युक्तस्य सम्पूर्णस्य द्विचक्रीयवृक्षस्य कृते यदि सर्वे नोड् 0 तः आरभ्य उपरितः अधः यावत् सरणीक्रमेण आरभ्य वामतः दक्षिणतः, तर्हि क्रमाङ्कसङ्ख्या i युक्तस्य नोड् कृते:
    • यदि i>0, तर्हि i स्थाने नोडस्य मातापितृसङ्ख्या: (i-1)/2;, i मूलनोडसङ्ख्या अस्ति, मातापितृनोड् नास्ति
    • यदि २i+१, 2i+1>=n अन्यथा वामसन्ततिः नास्ति
    • यदि २i+२, 2i+2>=n अन्यथा सम्यक् बालकः नास्ति

२.४ द्विचक्रीयवृक्षस्य भण्डारणसंरचना

द्विचक्रीयवृक्षाणां संग्रहणं सामान्यतया द्वयोः संरचनायोः उपयोगेन कर्तुं शक्यते ।क्रमिकसंरचना, श्रृङ्खलासंरचना।

  1. क्रमिक भण्डारण
    क्रमिकसंरचनाभण्डारणस्य उपयोगः भवतिसरणीसंग्रहणार्थं सामान्यतया सरणीं उपयुज्यताम्केवलं पूर्णद्विचक्रीयवृक्षाणां प्रतिनिधित्वार्थं उपयुक्तम् , यतः सः सम्पूर्णः द्विचक्रीयः वृक्षः नास्ति तथा च अन्तरिक्षस्य अपव्ययः भविष्यति। यथार्थतः केवलं राशः एव भण्डारणार्थं सरणीनां उपयोगं करोति ।द्विचक्रीयवृक्षाणां क्रमिकभण्डारणं भौतिकरूपेण सरणी भवति, तार्किकरूपेण च द्विचक्रीयवृक्षः भवति ।
    अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु2. श्रृङ्खलाभण्डारणम्
    द्विचक्रीयवृक्षस्य लिङ्क्ड् भण्डारसंरचना,द्विचक्रीयवृक्षस्य प्रतिनिधित्वार्थं लिङ्क् कृतसूचिकायाः ​​उपयोगं कुर्वन्तु , अर्थात् तत्त्वानां तार्किकसम्बन्धं सूचयितुं शृङ्खलानां प्रयोगः । **सामान्यविधिः अस्ति यत् लिङ्क् कृतसूचौ प्रत्येकं नोड् त्रयः क्षेत्राणि सन्ति, data field तथा च वाम-दक्षिण-सूचकक्षेत्राणि वाम-दक्षिण-सूचकयोः उपयोगः भवति यत्र वाम-बालकः च नोडस्य दक्षिणबालः क्रमशः स्थिताः सन्ति। **शृङ्खलासंरचना द्विचक्रीयशृङ्खलासु त्रिविभक्तशृङ्खलासु च विभक्ताः सन्ति सम्प्रति वयं सामान्यतया द्विचक्रीयशृङ्खलासु अध्ययनं कुर्मः।
    अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

3. द्विचक्रीयवृक्षस्य क्रमिकसंरचना कार्यान्वयनञ्च

साधारणाः द्विचक्रीयवृक्षाः सरणीषु भण्डारणार्थं न उपयुक्ताः यतः तत्र बहु ​​अपव्ययः स्थानं भवितुम् अर्हति ।तथाक्रमिकसंरचनाभण्डारणार्थं सम्पूर्णाः द्विचक्रीयवृक्षाः अधिकं उपयुक्ताः भवन्ति .यथार्थतः वयं प्रायःराशौ (द्विचक्रीयवृक्षः) संग्रहणार्थं क्रमिकसंरचनानां सरणीं उपयुङ्क्ते, अत्रत्याः राशौ, प्रचालनतन्त्रस्य आभासीप्रक्रियासङ्केतस्थाने च राशौ भिन्नौ वस्तूनि सन्ति, एकं दत्तांशसंरचना, अपरं च क्षेत्रविभाजनं यत् प्रचालनतन्त्रे स्मृतिं प्रबन्धयति
विशिष्टकार्यन्वयनार्थं अनुप्रयोगाय च कृपया पश्यन्तु :[Data Structure] 08. ढेरः तथा ढेरः अनुप्रयोगाः

4. द्विचक्रीयवृक्षस्य श्रृङ्खलासंरचना तस्य कार्यान्वयनञ्च

४.१ द्विचक्रीयवृक्षपरिभ्रमणम्

द्विचक्रीयवृक्षसंरचना ज्ञातुं सरलतमः उपायः तस्य पारगमनम् अस्ति ।तथाकथितद्विचक्रीयवृक्षपरिभ्रमणं (Traversal) द्विचक्रीयवृक्षे नोड्स् इत्यत्र कतिपयनियमानुसारं क्रमेण तदनुरूपं कार्यं कर्तुं भवति, प्रत्येकं नोडं केवलं एकवारं संचालितं भवति . नोड्-अभिगमनेन क्रियमाणानि कार्याणि विशिष्ट-अनुप्रयोग-समस्यायाः उपरि निर्भरं भवन्ति । द्विचक्रीयवृक्षे ट्रैवर्सल् इति महत्त्वपूर्णेषु कार्येषु अन्यतमम् अस्ति तथा च द्विचक्रीयवृक्षे अन्येषां क्रियाणां आधारः अपि अस्ति ।

४.१.१ पूर्वादेशः पारगमनम्

//根 左子树 右子树
void PrevOrder(pTreeNode root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ", root->val);
	PrevOrder(root->left);
	PrevOrder(root->right);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

अधोलिखिते चित्रे पुनरावर्तनीयप्रक्रिया दर्शिता अस्ति : १.
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

४.१.२ क्रमेण परिभ्रमणम्

//左子树 根 右子树
void InOrder(pTreeNode root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

पुनरावर्तनीयप्रक्रिया निम्नलिखितम् अस्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

४.१.३ उत्तरक्रमपरिभ्रमणम्

//左子树 右子树 根
void PostOrder(pTreeNode root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

पुनरावर्तनीयप्रक्रिया निम्नलिखितम् अस्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

४.२.४ स्तरक्रमपरिभ्रमणम्

स्तर-क्रम-भ्रमणम् : पूर्व-क्रम-परिभ्रमणं, क्रम-अन्तर्गत-अनुक्रमणं, क्रम-उत्तर-भ्रमणं च इत्येतयोः अतिरिक्तं द्विचक्रीयवृक्षेषु स्तर-क्रम-परिभ्रमणं अपि कर्तुं शक्यते द्विचक्रीयवृक्षस्य मूलनोड् इत्यस्य स्तरसङ्ख्या 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

४.१ द्विवृक्षाणां निर्माणं नाशं च

द्विचक्रीयवृक्षं निर्मातुं नाशयितुं च वयं उपयुञ्ज्महेद्विचक्रीय वृक्षभ्रमणम्उदाहरणतया।

//二叉树的创建
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
//二叉树的销毁
void TreeDestroy(struct TreeNode* root)
{
    if(root==NULL)
    {
        return;
    }
    TreeDestroy(root->left);
    TreeDestroy(root->right);
    free(root);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

४.३ द्विचक्रीयवृक्षेषु अन्ये क्रियाः

निम्नलिखितक्रियाः सर्वाणि भ्रमणविचारेन सह क्रियन्ते ।

// 二叉树节点个数
int TreeSize(pTreeNode root)
{
	if (root == NULL)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
// 二叉树叶子节点个数
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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
// 二叉树第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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
// 二叉树查找值为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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
//二叉树的高度
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
//判断是否是完全二叉树
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36