25.二叉樹的應用例項 演算法設計:判斷兩棵二叉樹A與B是否相似,即要麼它們都為空或都只有一個根結點,要麼它們的左右子樹均相似。 演算法思路: 1、保留之前所寫二叉樹標頭檔案內容。 2、再設計判斷相似演算法L
25.二叉樹的應用例項
演算法設計:判斷兩棵二叉樹A與B是否相似,即要麼它們都為空或都只有一個根結點,要麼它們的左右子樹均相似。
演算法思路:
1、保留之前所寫二叉樹標頭檔案內容。
2、再設計判斷相似演算法Like(BiTreeNode *A, BiTreeNode *B),該演算法功能是:若A與B相似,則函式返回1,否則返回0,具體如下:
(1)若A== B==NULL,則A與B相似,即Like(A,B)=1;
(2)若A與B有一個為NULL,另一個不為NULL,則A與B不相似,即Like(A,B)=0;
(3)採用遞迴方法,進一步判斷A的左子樹和B的左子樹、A的右子樹和B的右子樹是否相似。
3、在主函式中實現,驗證兩棵樹是否相似。(需要先建立兩棵樹,然後再判定)
標頭檔案1:BiTree.h
#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node* leftChild;
struct Node* rightChild;
}BiTreeNode;
void Initiate(BiTreeNode** root)
{
*root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
(*root)->leftChild = NULL;
(*root)->rightChild = NULL;
}
BiTreeNode* InsertLeftNode(BiTreeNode* curr, DataType x)
{
BiTreeNode* s, * t;
if (curr == NULL)
return NULL;
t = curr->leftChild;
s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data = x;
s->leftChild = t;
s->rightChild = NULL;
curr->leftChild = s;
return curr->leftChild;
}
BiTreeNode* InsertRightNode(BiTreeNode* curr, DataType x)
{
BiTreeNode* s, * t;
if (curr == NULL)
return NULL;
t = curr->rightChild;
s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
s->data = x;
s->rightChild = t;
s->leftChild = NULL;
curr->rightChild = s;
return curr->rightChild;
}
void Destroy(BiTreeNode** root)
{
if ((*root) != NULL && (*root)->leftChild != NULL)
Destroy(&(*root)->leftChild);
if ((*root) != NULL && (*root)->rightChild != NULL)
Destroy(&(*root)->rightChild);
free(*root);
}
標頭檔案2:BiTreeTraverse.h
#include"BiTree.h"
void Visit(DataType item)
{
printf("%c ", item);
}
void PrintBiTree(BiTreeNode* root, int n)
{
int i;
if (root == NULL)
return;
PrintBiTree(root->rightChild, n + 1);
for (i = 0; i < n - 1; i++)
printf(" ");
if (n > 0)
{
printf("---");
printf("%c\n", root->data);
}
PrintBiTree(root->leftChild, n + 1);
}
BiTreeNode* Search(BiTreeNode* root, DataType x)
{
BiTreeNode* find = NULL;
if (root != NULL)
{
if (root->data == x)
find = root;
else
{
find = Search(root->leftChild, x);
if (find == NULL)
find = Search(root->rightChild, x);
}
}
return find;
}
void PreOrder(BiTreeNode* t, void Visit(DataType item))
{
if (t != NULL)
{
Visit(t->data);
PreOrder(t->leftChild, Visit);
PreOrder(t->rightChild, Visit);
}
}
void InOrder(BiTreeNode* t, void Visit(DataType item))
{
if (t != NULL)
{
InOrder(t->leftChild, Visit);
Visit(t->data);
InOrder(t->rightChild, Visit);
}
}
void PostOrder(BiTreeNode* t, void Visit(DataType item))
{
if (t != NULL)
{
PostOrder(t->leftChild, Visit);
PostOrder(t->rightChild, Visit);
Visit(t->data);
}
}
原始檔:main.c
#include"BiTreeTraverse.h"
int Like(BiTreeNode* a, BiTreeNode* b)
{
if ((a == NULL && b != NULL) || (a != NULL && b == NULL))
return 0;
if (a == NULL && b == NULL)
return 1;
return Like(a->leftChild, b->leftChild) && Like(a->rightChild, b->rightChild);
}
int main()
{
BiTreeNode* root1, * root2, * p, * pp;
Initiate(&root1);
Initiate(&root2);c
p = InsertLeftNode(root1, '2');
p = InsertLeftNode(p, '6');
p = InsertRightNode(root1->leftChild, '4');
pp = p;
p = InsertLeftNode(p, '5');
p = InsertLeftNode(p, '3');
InsertRightNode(pp, '1');
p = InsertLeftNode(root2, '1');
p = InsertLeftNode(p, '2');
p = InsertRightNode(root2->leftChild, '3');
pp = p;
p = InsertLeftNode(p, '4');
p = InsertLeftNode(p, '5');
InsertRightNode(pp, '7');
PrintBiTree(root1, 0);
printf("\n");
PrintBiTree(root2, 0);
if (Like(root1, root2))
printf("兩棵樹相似!\n");
else
printf("兩棵樹不相似!\n");
Destroy(&root1);
Destroy(&root2);
return 0;
}
相關文章
- 判斷某棵二叉樹是否二叉排序樹二叉樹排序
- 【資料結構虛擬碼】設計判斷一棵二叉樹是否是二叉排序樹的演算法資料結構二叉樹排序演算法
- 判斷二叉樹是否為滿二叉樹二叉樹
- LeetCode題解(Offer26):判斷二叉樹A是否為二叉樹B的子樹(Python)LeetCode二叉樹Python
- 採用層次遍歷判斷二叉樹為完全二叉樹二叉樹
- LC49判斷二叉樹是否相等二叉樹
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 怎樣推斷一棵二叉樹是全然二叉樹二叉樹
- 【C++】判斷一顆二叉樹是否對稱C++二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 二叉樹的應用(1)--二叉樹排序樹基本操作二叉樹排序
- [Python手撕]判斷平衡二叉樹Python二叉樹
- 演算法-二叉樹演算法二叉樹
- 結構與演算法(05):二叉樹與多叉樹演算法二叉樹
- 演算法根據樹的前序遍歷構建二叉樹演算法二叉樹
- 劍指offer讀書筆記:每天一個程式設計題·iOS開發演算法提升計劃(1)(判斷是否為對稱二叉樹)筆記程式設計iOS演算法二叉樹
- [Python手撕]判斷二叉搜尋樹Python
- JZ79 判斷是不是平衡二叉樹二叉樹
- 刷題系列 - Python判斷是否映象對稱二叉樹Python二叉樹
- 二叉樹、B樹以及B+樹二叉樹
- 平衡二叉樹,B樹,B+樹二叉樹
- 前端演算法 - 二叉樹前端演算法二叉樹
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 二叉搜尋樹應用-判斷一個單詞是否拼寫正確,實現簡單字典
- 演算法題(三十五):二叉樹的下一個結點演算法二叉樹
- 假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——含具體實現工程二叉樹字元演算法
- LeetCode題解(Offer28):判斷二叉樹是否左右對稱(Python)LeetCode二叉樹Python
- 872. 葉子相似的樹
- 【資料結構與演算法】二叉樹資料結構演算法二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 二叉樹的子樹和子結構 c++二叉樹C++
- #查詢演算法#【2】二叉排序樹演算法排序
- 二叉樹的子結構二叉樹
- 【資料結構】【二叉樹】四、二叉搜尋樹的特性(不斷補充)資料結構二叉樹
- 資料結構與演算法:二叉排序樹資料結構演算法排序