二叉樹(二叉查詢樹)是這樣一類的樹,父節點的左邊孩子的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...