一.完全二叉树:子节点只存在左右节点的树。下标特征:父节点=子节点/2。

二.最小堆:从根节点开始,由小到大展开的完全二叉树。

三.二叉排序树(又名二叉搜索树):左节点都小于父节点,右节点都大于父节点的二叉树。(常用中根遍历)

四.核心:二叉树的遍历(前序、中序、后序),遍历二叉树通用方法使用分治的思想,时间复杂度与节点个数有关,O(n) n表示递归次数。

按1到13的顺序排下去的二叉树,遍历分别

  begin

/     前序

middle  —  end         前序:1 - 2、4、8、9、5、10、11 - 3、6、12、13、7

 

  middle

/  中序   \

begin        end          中序:8、4、9、2、10、5、11-1-12、6、13、3、7

 

   end

   后序   \

begin  —  middle

1.前序遍历二叉树

#import "ViewController.h"

@interface TreeNote : NSObject

@property (nonatomic , assign) NSInteger val;

@property (nonatomic , weak) TreeNote *left;

@property (nonatomic , weak) TreeNote *right;

@end

@implementation TreeNote

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    TreeNote *rootTree = [[TreeNote alloc]init];
    rootTree.val = 1;
    
    TreeNote *rightTree = [TreeNote new];
    rightTree.val = 2;
    rootTree.right = rightTree;
    
    TreeNote *leftTree = [TreeNote new];
    leftTree.val = 3;
    rightTree.left = leftTree;
    
    //给出一棵二叉树,返回其节点值的前序遍历。
    NSArray *result = [self preorderTraversal:rootTree];
    NSLog(@"result = %@",result);
}


//Version 1:Traverse
//- (NSArray *)preorderTraversal:(TreeNote *)root
//{
//    NSMutableArray *result = [NSMutableArray array];
//    [self traverse:root result:result];
//    return result;
//}


- (void)traverse:(TreeNote *)root
          result:(NSMutableArray *)result
{
    if (root == nil) {
        return;
    }
    [result addObject:@(root.val)];
    [self traverse:root.left result:result];
    [self traverse:root.right result:result];
}


//Version 2: Divide & Conquer
//- (NSArray *)preorderTraversal:(TreeNote *)root
//{
//    NSMutableArray *result = [NSMutableArray array];
//    if (root == nil) {
//        return result;
//    }
//    //divide
//    NSArray *leftList = [self preorderTraversal:root.left];
//    NSArray *rightList = [self preorderTraversal:root.right];
//
//    //conquer
//    [result addObject:@(root.val)];
//    [result addObjectsFromArray:leftList];
//    [result addObjectsFromArray:rightList];
//
//    return result;
//}

//Version 0: Non-Recursion
- (NSArray *)preorderTraversal:(TreeNote *)root
{
    NSMutableArray *stack = [NSMutableArray array];
    NSMutableArray *result = [NSMutableArray array];
    
    [stack addObject:root];
    while (stack.count != 0)
    {
        TreeNote *node = stack.lastObject;
        [stack removeLastObject];
        [result addObject:@(node.val)];
        if (node.right != nil)
        {
            [stack addObject:node.right];
        }
        
        if (node.left != nil)
        {
            [stack addObject:node.left];
        }
    }
    return result;
}

@end

 2.使用队列对二叉树进行层次遍历

#import "ViewController.h"

@interface TreeNode : NSObject

@property (nonatomic, assign) NSInteger val;

@property (nonatomic, strong) TreeNode *left;

@property (nonatomic, strong) TreeNode *right;

@end

@implementation TreeNode

@end


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    TreeNode *root = [TreeNode new];
    root.val = 3;
    TreeNode *fLeft = [TreeNode new];
    fLeft.val = 9;
    TreeNode *fRight = [TreeNode new];
    fRight.val = 20;
    TreeNode *sLeft = [TreeNode new];
    sLeft.val = 0;
    TreeNode *sRight = [TreeNode new];
    sRight.val = 0;
    TreeNode *tLeft = [TreeNode new];
    tLeft.val = 15;
    TreeNode *tRight = [TreeNode new];
    tRight.val = 7;
    
    root.left = fLeft;
    root.right = fRight;
    
    fRight.left = tLeft;
    fRight.right = tRight;
    
    NSArray *list = [self levelOrder:root];
    NSLog(@"list = %@",list);
}


- (NSArray *)levelOrder:(TreeNode *)root
{
    NSMutableArray *result = [NSMutableArray array];
    if (root == nil) {
        return result;
    }
    //
    NSMutableArray *queue = [NSMutableArray array];
    [queue addObject:root];
    
    while (queue.count != 0)
    {
        NSMutableArray *level = [NSMutableArray array];
        int n = (int)queue.count;
        for (int i = 0 ; i < n; i++)
        {
            TreeNode *head = queue.firstObject;
            [level addObject:@(head.val)];
            if (head.left.val != 0)
            {
                [queue addObject:head.left];
            }
            
            if (head.right.val != 0)
            {
                [queue addObject:head.right];
            }
            [queue removeObjectAtIndex:0];
        }
        [result addObject:level];
    }
    return result;
}

@end

3.二叉树的中序遍历

class TreeNode
{
    public int val;
    public TreeNode left,right;
    public TreeNode(int val)
    {
        this.val = val;
        this.left = this.right = null;
    }
}

public class Main {

    public static void main(String[] args) {
    // write your code here
        TreeNode root = new TreeNode(1);
        TreeNode fLeft = new TreeNode(2);
        TreeNode fRight = new TreeNode(3);
        TreeNode sLeft  = new TreeNode(4);
        TreeNode sRight = new TreeNode(5);
        TreeNode tLeft = new TreeNode(6);
        TreeNode tRight = new TreeNode(7);
        TreeNode fourLeft = new TreeNode(8);
        TreeNode fourRight = new TreeNode(9);
        TreeNode fifthLeft = new TreeNode(10);
        TreeNode fifthRight = new TreeNode(11);
        TreeNode sixLeft = new TreeNode(12);
        TreeNode sixRight =  new TreeNode(13);

        root.left = fLeft;//2
        root.right = fRight;//3
        fLeft.left = sLeft;//4
        fLeft.right = sRight;//5
        fRight.left = tLeft;//6
        fRight.right = tRight;//7
        sLeft.left = fourLeft;//8
        sLeft.right = fourRight;//9
        sRight.left = fifthLeft;//10
        sRight.right = fifthRight;//11
        tLeft.left = sixLeft;//12
        tLeft.right = sixRight;//13

        ArrayList<Integer> list =  inorderTraversal(root);
        for (int i = 0; i < list.size(); i++) {
            System.out.printf("%d\n",list.get(i));
        }
    }
    
    public static ArrayList<Integer> inorderTraversal(TreeNode root)
    {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        ArrayList<Integer> result = new ArrayList<Integer>();
        TreeNode curt = root;
        while (curt != null || !stack.empty())
        {
            while (curt != null)
            {
                stack.add(curt);
                curt = curt.left;
            }
            curt = stack.peek();
            stack.pop();
            result.add(curt.val);
            curt = curt.right;
        }
        return result;
    }
    
}

 

posted @ 2016-02-26 11:00  forrHuen  阅读(245)  评论(0编辑  收藏  举报