二叉樹是一種每個節(jié)點最好有左右兩個子節(jié)點的樹結(jié)構(gòu)。概念的東西就不倒騰了。意思意思就好。
算法之中,對于二叉樹類的問題 一般使用遞歸的思想去解它。
二叉排序樹/二叉查找樹/二叉搜索樹 這三者都是一個東西,是一種特殊的二叉樹,它滿足下面幾個條件:
1.若左子樹不為空 那么左子樹的所有節(jié)點都小于根節(jié)點
2.若右子樹不為空 那么右子樹的所有節(jié)點都大于根節(jié)點
3.左右子樹分別又是二叉搜索樹
4.整個樹結(jié)構(gòu)中 沒有鍵值相等的兩個節(jié)點
二叉樹類的定義(oc 版)
@interface BTNode : NSObject
@Property (nonatomic, assign) NSInteger value; //值
@property (nonatomic, strong) BTNode *left; //左子節(jié)點
@property (nonatomic, strong) BTNode *right; //右子節(jié)點
@end
二叉樹的創(chuàng)建
/**
- 創(chuàng)建二叉排序樹
- 二叉排序樹:左節(jié)點值全部小于根節(jié)點值,右節(jié)點值全部大于根節(jié)點值
- @param values 數(shù)組
- @return 二叉樹根節(jié)點
*/
-
(BinaryTreeNode *)createTreeWithValues:(NSArray *)values {
BinaryTreeNode *root = nil;
for (NSInteger i=0; i<values.count; i++) {
NSInteger value = [(NSNumber *)[values objectAtIndex:i] integerValue];
root = [BinaryTree addTreeNode:root value:value];
}
return root;
}
/**
- 向二叉排序樹節(jié)點添加一個節(jié)點
- @param treeNode 根節(jié)點
- @param value 值
- @return 根節(jié)點
*/
-
(BinaryTreeNode *)addTreeNode:(BinaryTreeNode *)treeNode value:(NSInteger)value {
//根節(jié)點不存在,創(chuàng)建節(jié)點
if (!treeNode) {
treeNode = [BinaryTreeNode new];
treeNode.value = value;
NSLog(@"node:%@", @(value));
}
else if (value <= treeNode.value) {
NSLog(@"to left");
//值小于根節(jié)點,則插入到左子樹
treeNode.leftNode = [BinaryTree addTreeNode:treeNode.leftNode value:value];
}
else {
NSLog(@"to right");
//值大于根節(jié)點,則插入到右子樹
treeNode.rightNode = [BinaryTree addTreeNode:treeNode.rightNode value:value];
}return treeNode;
}