C語言實現二叉樹的搜尋及相關演算法示例

2022-10-04 01:00:17 字數 3307 閱讀 6108

二叉樹(二叉查詢樹)是這樣一類的樹,父節點的左邊孩子的key都小於它,右邊孩子的key都大於它。

二叉樹在查詢和儲存中通常能保持logn的查詢、插入、刪除,以及前驅、後繼,最大值,最小值複雜度,並且不占用額外的空間。

這裡演示二叉樹的搜尋及相關演算法:

#include

#include

using namespace std;

class tree_node

~tree_node(){}

}void visit(int value)

// 插入

tree_node * insert_tree(tree_node *root, tree_node* node)

if (!root)

tree_node * p = root;

while (p)

else

}else

else

}} return root;

}// 查詢key所在node

tree_node* search_tree(tree_node* root, int key)

else if (key > p->key)

else

} return null;

}// 建立樹

tree_node* create_tree(tree_node *t, int n)

tree_node* p = root->left;

wwww.cppcns.comhile (p->right)

return p;

}// 節點後繼

tree_node* tree_suc(tree_node* root)

tree_node* p = root->right;

while (p->left)

return p;

}// 中序遍歷

void tree_walk_mid(tree_node *root)

tree_walk_mid(root->left);

visit(root->key);

tree_walk_mid(root->right);

}// 中序遍歷非遞迴

void tree_walk_mid_norecursive(tree_node *root)

tree_node* p = root;

stack s;

while (!s.empty() || p)

if (!s.empty())

}}// 前序遍歷

void tree_walk_pre(tree_node *root)

visit(root->key);

tree_walk_pre(root->left);

tree_walk_pre(root->right);

}// 前序遍歷非遞迴

void tree_walk_pre_norecursive(tree_node *root)

stack s;

tree_node* p = root;

s.push(p);

while (!s.empty())

if (node->left)

}}// 後序遍歷

void tree_walk_post(tree_node *root)

tree_walk_post(root->left);

tree_walk_post(root->right);

visit(root->key);

}// 後序遍歷非遞迴

void tree_walk_post_norecursive(tree_node *root)

stack s;

s.push(root);

while (!s.empty())

if (node->left)

}else

}}// 層級遍歷非遞迴

void tree_walk_level_norecursive(tree_node *root)

queue q;

tree_node* p = root;

q.push(p);

while (!q.empty())

if (node->right)

}}// 拷貝樹

tree_node * tree_copy(tree_node *root)

tree_node* newroot = new tree_node();

newroot->key = root->key;

newroot->left = tree_copyqxehhkblem(root->left);

newroot->right = tree_copy(root->right);

return newroot;

}// 拷貝樹

tree_node * tree_copy_norecursive(tree_node *root)

tree_node* newroot = new tree_node();

newroot->key = root->key;

stack s1, s2;

tree_node *p1 = root;

tree_node *p2 = newroot;

s1.push(root);

s2.push(newroot);

while (!s1.empty())

if (node1->left)

} return newroot;

}int main()

t[0].key = 5;

tree_node* root = create_tree(t, 6);

//tree_walk_mid(root);

//tree_walk_mid_norecursive(root);

//tree_walk_pre(root);

//tree_walk_pre_norecursive(root);

//tree_walk_post(root);

//tree_walk_post_norecursive(root);

//tree_walk_level_norecursive(root);

visit(search_tree(root, 6)->key);

visit(tree_pre(root)->key);

visit(tree_suc(root)->key);

//tree_node* newroot = tree_copy_norecursive(root);

//tree_walk_mid(newroot);

return 0;

}本文位址:

C語言實現 二叉搜尋樹

什麼是二叉搜尋樹?二叉搜尋樹是一顆二叉樹,樹中的每乙個節點的值都是大於其左子樹的值小於其右子樹的值,而且其每一棵子樹都是一顆二叉搜尋樹,其中序遍歷結果是從小到大依次排列的。以下是二叉搜尋樹的相關操作的 pragma once include include include typedef char ...

二叉樹遍歷及C語言實現

二叉樹遍歷及c 語言實現 已知中序和前序序列,或者已知中序和後序序列,都能夠構造一棵二叉樹。在本例中,本人用c 語言寫程式解答了下面兩個演算法題 1 給出一棵二叉樹的中序與後序遍歷序列,求出它的先序遍歷序列。2 給出一棵二叉樹的中序與先序遍歷序列,求出它的後序遍歷序列。知識點扼要回顧 所謂二叉樹的遍...

C語言實現二叉樹

1.c語言實現二叉樹中節點間最大距離 includetypedef struct treenode treenode 我們可以將所有的結點的左右子樹的高度和計算一下,然後取出最大值,就是最遠的距離。int getmaxdistance treenode root,int maxdistance in...