二叉樹(二叉查詢樹)是這樣一類的樹,父節點的左邊孩子的key都小於它,右邊孩子的key都大於它。
二叉樹在查詢和儲存中通常能保持logn的查詢、插入、刪除,以及前驅、後繼,最大值,最小值複雜度,並且不占用額外的空間。
#include#includeusing 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;
while (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;
stacks;
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)
stacks;
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)
stacks;
s.push(root);
while (!s.empty())
if (node->left)
} else }}
// 層級遍歷非遞迴
void tree_walk_level_norecursive(tree_node *root)
queueq;
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_copy(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;
stacks1, 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;
}
二叉樹相關演算法
節點 class node t public node t left public node t right public node t value,node t left,node t right public node t value this value,null null 二叉樹 前中後深度...
二叉樹相關演算法 二
leetcode 437.path sum iii 第乙個想法就是遍歷二叉樹,找出每個節點的可能性。這個思路時間複雜度為o n 2 private int num public intpathsum treenode root,int sum private void recur treenode ...
二叉樹 二叉樹的相關操作
遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...