判斷所給二叉樹是否是紅黑樹

2021-07-06 02:07:01 字數 1542 閱讀 1906

先總結下知識點。

紅黑樹就是帶有顏色的平衡二叉搜尋樹加五個特殊屬性

1,所有節點只能是紅或黑色

2,所有葉子都是黑色,並且不存有效資料(如果你要自己構造乙個紅黑樹,葉子節點設定為null就可以,其實就是你的結構儲存完所有有效資料後把當前的葉子節點(這些葉子是存有有效資料的)當成內節點,給他們乙個構造乙個null的葉子節點)

3,根節點只能是黑色

4,每個紅節點必有兩個子黑節點,即不能有連續的兩個紅節點

5,樹中任一節點到其子樹內任意葉子的路徑上黑色節點個數相同,此限制也使任意節點的兩條葉子路徑長度不超過2倍差別

如此,要判斷乙個給定的二叉樹是不是紅黑樹就是要判斷其是不是平衡搜尋二叉樹(bst)並且滿不滿足上面5個條件

結構型別:

#define red 'r'

#define black 'b'

typedef struct t

t;根據輸入檔案裡節點的資料建立紅黑樹:

void creater_b_bt(file* ft,t ** root)

}*root=ptrt[1];

ptrt[1]->parent=null;

ptrt[1]->left=null;

ptrt[1]->right=null;

for(i=2;i<=node->key;i++)

else

ptrt[i]->left=null;

ptrt[i]->right=null;}}

判斷是否是二叉搜尋樹:

bool  isbst( t *head ,int *max,int *min)

else if(isbst(pnode->left,&nmax,&nmin))

else

return false;

}else

return false;

if(pnode->right==null)

else if(isbst(pnode->right,&nmax,&nmin))

else

return false;

}else

return false;

return true;

}判斷是否是紅黑樹:

int  isr_b_tree(t *node,int *result)

if(node->parent==null)

}else

}if(*result!=0)

numblack_l+=isr_b_tree(node->left,result);

if(*result!=0)

numblack_r+=isr_b_tree(node->right,result);

if(*result==0)

return -1;

if(node->left&&node->left->colour==black)

if(node->right&&node->right->colour==black)

if( numblack_l!=numblack_r)

return numblack_l;

}

二叉樹 紅黑樹

也就是說,二叉排序樹中,左子樹都比節點小,右子樹都比節點大,遞迴定義。根據二叉排序樹這個特點我們可以知道,二叉排序樹的中序遍歷一定是從小到大的,比如上圖,中序遍歷結果是 1 3 4 6 7 8 10 13 14 效能取決於 public class demo public static void m...

紅黑二叉樹

紅黑二叉樹 紅黑二叉樹的基本思想是想用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表述2 3樹。或者說,我們將3 結點表示為由一條左斜的紅色鏈結相 兩個2 結點其中之一是另乙個的左子節點 連的兩個2 結點。這種表示的優點 我們無需修改就可以直接使用標準二叉查詢樹的get ...

二叉樹(三) 紅黑樹

紅黑樹是一種自平衡的二叉查詢樹,可解決二叉查詢樹因為多次插入新節點導致的不平衡問題。除了二叉查詢樹的基本特性外,還具有下列的特性 1 節點是紅色或者黑色 2 根節點是黑色 3 每個葉子節點都是黑色的空節點 nil節點 4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅...