BiTree 二叉樹 基礎演算法及常見題目總結

2021-06-10 03:08:48 字數 4135 閱讀 2876

1,對二叉樹的幾個相關概念的理清(概念內容均來自演算法導論附錄b的內容)

(1),樹:是乙個連通的,無迴路的無向圖,如果無向圖是無迴路但是非連通的,稱為「森林「

(2),有根樹和有序樹

有根樹是一顆自由樹,它有乙個與其他點不同的結點,為樹的「根」,是唯一沒有雙親的結點,沒有子女的結點是葉結點或外部結點。有根樹結點的子女數稱為結點的「」,結點在樹中的高度是結點向下到某個葉結點最長簡單路徑中邊的條數。樹的高度是根的高度,

一棵滿二叉樹,即每個內部結點都有兩個子女的二叉樹的結點個數為2^h - 1 , h為樹的高度。 //

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include using namespace std;

struct bitree

;void print(bitree* root)

void inorder_tree_walk(bitree* root)

}void preorder_tree_walk(bitree* root)

}void postorder_tree_walk(bitree* root)

}int is_postorder(int a,int len)

else

int left = len - 2;

if (left > 0)

else

} }

return flag;

}void tree_insert_recursion(bitree* root, int key)

else if (key < root->m_pleft->key)

else }

bitree* makenode(int key)

void delnode(bitree* pnode)

//構建二叉查詢樹

void tree_insert(bitree* root, int key)

else

}bitree* z = makenode(key);

z->m_pparent = y;

if (y == null)

else

else

}}//二叉查詢樹最小值

bitree* tree_minimum(bitree* root)

return root;

}//二叉查詢樹最大值

bitree* tree_maximum(bitree* root)

return root;

}bitree* tree_successor(bitree* node)

bitree* p = node->m_pparent;

while ( p != null && p->m_pright == node)

return p;

}void tree_delete(bitree* root, bitree* node)

else

//開始刪除

if (y->m_pleft != null)

else

if (x != null) //y是內節點

if (y->m_pparent == null) // 被刪除的是根節點

else if(y == y->m_pparent->m_pleft)

else

if ( y->key != node->key )//情況3 }

void find_dis_helper(bitree* node, int& max_dis, int& max_depth)

if (node->m_pright != null)

max_depth = (left_max_depth > right_max_depth ? left_max_depth : right_max_depth) + 1;

int tmp_total = left_max_depth + right_max_depth + 2;

int tmp_dis = left_max_dis > right_max_dis ? left_max_dis : right_max_dis;

max_dis = max_dis > tmp_dis ? max_dis : tmp_dis;

max_dis = max_dis > tmp_total ? max_dis : tmp_total;

}//尋找二叉樹兩個距離最遠的結點

int find_longest_distance(bitree* root)

//反轉二叉樹

void mirrorbitree(bitree* root)

mirrorbitree(root->m_pleft);

mirrorbitree(root->m_pright);

bitree* tmp = root->m_pleft;

root->m_pleft = root->m_pright;

root->m_pright = tmp;

}void getheight_helper(bitree* root, int& height, int& max_height)

int tmp_height = height + 1;

getheight_helper(root->m_pleft, tmp_height, max_height);

getheight_helper(root->m_pright, tmp_height, max_height);

if (max_height < height) }

int getheight(bitree* root)

//分層列印二叉樹

void printbitreebylevel(bitree* root, int level)

if (root->m_pleft != null)

if (root->m_pright != null) }

void visit(bitree* node)

}void preordernonrecursive(bitree* node)

}void inordernonrecursive(bitree* node)

else

}}void postordernonrecursive(bitree* node)

while(!handywork.empty())

else//若它的右孩子存在且rvisited為0,說明以前還沒有動過它的右孩子,於是就去處理一下其右孩子。

} }}

int main(int argc, char* argv)

; bitree* root = makenode(a[0]);

for (int i = 1; i < 5; i++)

printf("inorder\r\n");

inorder_tree_walk(root);

printf("\r\n");

inordernonrecursive(root);

printf("\r\n");

printf("preorder\r\n");

preorder_tree_walk(root);

printf("\r\n");

preordernonrecursive(root);

printf("\r\n");

printf("postorder\r\n");

postorder_tree_walk(root);

printf("\r\n");

postordernonrecursive(root);

printf("\r\n");

int a = ;

printf("%d\r\n", is_postorder(a,4));

printf("%d\r\n",find_longest_distance(root));

printbitreebylevel(root, 1);

mirrorbitree(root);

printbitreebylevel(root, 1);

printf("\r\n height = %d", getheight(root));

return 0;

}

樹,二叉樹及演算法總結

滿二叉樹在同樣深度的二叉樹中葉子結點個數最多 1.葉子結點只能出現在最下兩層,且最下層的葉子結點都集中在二叉樹的左部 2.完全二叉樹中如果有度為1的結點,只可能有乙個,且該結點只有左孩子。3.深度為k的完全二叉樹在k 1層上一定是滿二叉樹。1 有n個節點的完全二叉樹的深度為 k l og2n k l...

演算法基礎之二叉樹

本文主要包括樹相關的演算法,二叉樹結點基本結構如下 function treenode x 本文還會繼續更新。function depth proot var depth 0 var currdepth 0 dfs proot return depth function dfs node currd...

演算法筆記 二叉樹基礎

如何表示 或者儲存 一棵二叉樹?想要儲存一棵二叉樹,我們有兩種方法,一種是基於指標或者引用的二叉鏈式儲存法,一種是基於陣列的順序儲存法。1.鏈式儲存 每個節點有三個字段,其中乙個儲存資料,另外兩個是指向左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整棵樹都串起來。這種儲存方式我...