二叉樹的相關演算法

2021-06-20 15:54:40 字數 3263 閱讀 8921

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