二叉树的创建、遍历、翻转

BinaryTreeNode.h
//
//  BinaryTreeNode.h
//  BinaryTree
//
//  Created by KeSen on 15/9/7.
//  Copyright (c) 2015年 KeSen. All rights reserved.
//

#import <Foundation/Foundation.h>

@class BinaryTreeNode;

@interface BinaryTreeNode : NSObject

// 添加节点
+ (BinaryTreeNode *)addTree:(BinaryTreeNode *)p addValue:(id)value;

// 中序遍历
- (void)inOrderBinaryTree:(BinaryTreeNode *)p;

// 翻转
- (BinaryTreeNode *)invertTree:(BinaryTreeNode *)p;

@end
BinaryTreeNode.m
//
//  BinaryTreeNode.m
//  BinaryTree
//
//  Created by KeSen on 15/9/7.
//  Copyright (c) 2015年 KeSen. All rights reserved.
//

#import "BinaryTreeNode.h"

@implementation BinaryTreeNode
{
    id val;
    BinaryTreeNode *left;
    BinaryTreeNode *right;
}

// 添加节点
+ (BinaryTreeNode *)addTree:(BinaryTreeNode *)p addValue:(id)value {

    if (p == nil) {
        p = [[BinaryTreeNode alloc] init];
        p->val = value;
        p->left = nil;
        p->right = nil;

    } else if ([value integerValue] < [p->val integerValue]) {

        p->left = [BinaryTreeNode addTree:p->left addValue:value];
    } else {

        p->right = [BinaryTreeNode addTree:p->right addValue:value];
    }

    return p;
}

// 中序遍历二叉树
- (void)inOrderBinaryTree:(BinaryTreeNode *)p {

    if (p != nil) {
        [self inOrderBinaryTree:p->left];
        printf("%ld\n", (long)[p->val integerValue]);
        [self inOrderBinaryTree:p->right];
    }
}

- (BinaryTreeNode *)invertTree:(BinaryTreeNode *)p {

    if (p == nil) {
        return nil;
    }

    p->left = [p invertTree:p->left];
    p->right = [p invertTree:p->right];

    BinaryTreeNode *temp = p->left;
    p->left = p->right;
    p->right = temp;
    return p;
}

@end
main.m
//
//  main.m
//  BinaryTree
//
//  Created by KeSen on 15/9/7.
//  Copyright (c) 2015年 KeSen. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "BinaryTreeNode.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        BinaryTreeNode *root = nil;
        for (id value in @[@(2), @(5), @(6), @(8), @(9)]) {
            root = [BinaryTreeNode addTree:root addValue:value];
        }

        [root inOrderBinaryTree:root];

        printf("\n");

        BinaryTreeNode *invertTree = [root invertTree:root];
        [invertTree inOrderBinaryTree:invertTree];
    }
    return 0;
}

输出结果为:

2

5

6

8

9

9

8

6

5

2

github:https://github.com/action456789/BinaryTree

参考:http://blog.devtang.com/blog/2015/06/16/talk-about-tech-interview/

http://www.cocoachina.com/bbs/read.php?tid=177907

时间: 2024-10-09 07:11:47

二叉树的创建、遍历、翻转的相关文章

二叉树基本操作--创建,三种遍历,叶子节点

虽然二叉树的操作很常见,但是认真写写熟悉很重要,特别是typedef, CreateBiTree(BiTNode** T)指针的操作等等,还有就是创建方法,去实际输入值就知道其中的妙处,为-1时为空节点. #include <iostream> using namespace std; //节点的定义 typedef struct BTNode { int data; BTNode* rChild; BTNode* lChild; }BiTNode, *BiTree; //二叉树的创建,先序创

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

数据结构与算法第10周作业——二叉树的创建和遍历算法

一.二叉树的创建算法(递归方式) 二.二叉树的先序.中序和后序遍历算法 #include<stdio.h>#include<stdlib.h>typedef struct TNode{ struct TNode *lchild; int data; struct TNode *rchild;}TNode,*BTree;void createBiTree(BTree &T){ char x; scanf("%d",&x); if(x!=0) { T

二叉树的创建与遍历

#include<iostream>using namespace std; typedef char ELEMTYPE; //二叉链表typedef struct BiTNode{ ELEMTYPE data; struct BiTNode *lChild; struct BiTNode *rChild; }BiTNode,*BiTPtr; //创建二叉树,使用前序遍历的方式输入数据void CreateBiTree(BiTPtr *T){ char c; scanf("%c&qu

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr

【数据结构之二叉树】二叉树的创建、遍历等操作

二叉树的基本操作: 1.创建二叉树 2.销毁二叉树 3.遍历二叉树:1)前序遍历 2)中序遍历 3)后序遍历 4)层次遍历 4.搜索二叉树 5.删除子叶 6.插入子叶 7.获取左/右子叶的值 8.获取树深度 9.获取叶子结点数 1.创建二叉树 这里创建的是链式存储结构的二叉树,包含数据域,左右两结点的指针域:在读取创建树时,以#代替空格,输入格式的规范为:以前序遍历的顺序输入,如果该结点的左子叶为空,则输入#,以此类推: e.g: -  +         \ a    *    e    f 

二叉树的创建、遍历

二叉树的创建.这里采用最简单的情况,创建完全二叉树,用数组来保存: 1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 TreeNode(int x): val(x), left(NULL), right(NULL) {}; 6 }; 7 8 void CreatTree(TreeNode *root, int idx, int A[], int n) //root结点已分配,idx为根结点的编号 9 { 10 if(2 *

Java实现二叉树的创建和遍历操作(有更新)

博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但是二者原理是一致的,而且实现的方式也是大同小异! 下面就让我们来看看代码吧. 1.首先我们需要创建一个二叉树的节点类,便于我们对树的操作,当然了,你也可以在二叉树类的内部将节点类声明为内部类,但是这样会降低操作的灵活性.我才用的是单独创建一个BinaryTreeNode类,代码如下: package

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一