Swift-二叉树遍历

二叉树常见的四种遍历方式,先序遍历,中序遍历,后序遍历以及层次遍历,先来看一张二叉树的图:

《Swift-二叉树遍历》 FlyElephant.jpg

遍历之前我们可以先自己实现树,不过为了效率,可以通过函数自己创建树~

二叉树创建

方式一:
<pre><code>`
var d = TreeNode(data: “d”,leftChild: nil,rightChild: nil)

var b = TreeNode(data: “b”,leftChild: nil,rightChild: d)

var e = TreeNode(data: “e”,leftChild: nil,rightChild: nil)

var c = TreeNode(data: “c”, leftChild: nil, rightChild: e)

var a = TreeNode(data: “a”,leftChild: b,rightChild: c)

print(“FlyElephant”)
print(“先序遍历:”)
preOrder(a)
print(“\n中序遍历:”)
inOrder(a)
print(“\n后序遍历:”)
postOrder(a)
print()</code></pre> ![FlyElephant.png](http://upload-images.jianshu.io/upload_images/1048365-0d07d13eca381ff0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 方式二,输入一个先序的二叉树序列,空节点设置为#,以上图为例: <pre><code>
let rootList=”ABD##E##CF###”
var rootIndex = -1

func createTree(inout root:TreeNode?) -> Void {

rootIndex=rootIndex+1

if rootIndex>=rootList.characters.count {
    return
}

let data=rootList[rootIndex] as String
if data != "#" {
    root = TreeNode()
    root?.data = data
    
    createTree(&root!.leftChild)
    createTree(&root!.rightChild)
} else {
    root = nil
}

}`</code></pre>

二叉树的定义:
<pre><code>`
class TreeNode: NSObject {
var data:NSString?
var leftChild:TreeNode?
var rightChild:TreeNode?

override init() {}

init(data:NSString,leftChild:TreeNode?,rightChild:TreeNode?) {
    self.data = data
    self.leftChild = leftChild
    self.rightChild = rightChild
}

}`</code></pre>

先序遍历

遍历的顺序:根节点->左节点->右节点
<pre><code>func preOrder(rootNode:TreeNode?) -> Void { if rootNode != nil { if let data = rootNode?.data { print("\(data)\t", terminator: "") preOrder(rootNode?.leftChild) preOrder(rootNode?.rightChild) } } }</code></pre>

中序遍历

遍历的顺序:左节点->根节点->右节点
<pre><code>func preOrder(rootNode:TreeNode?) -> Void { if rootNode != nil { if let data = rootNode?.data { print("\(data)\t", terminator: "") preOrder(rootNode?.leftChild) preOrder(rootNode?.rightChild) } } }</code></pre>

后序遍历

遍历的顺序:左节点->右节点->根节点
<pre><code>func postOrder(rootNode:TreeNode?) -> Void { if rootNode != nil { if let data = rootNode?.data { postOrder(rootNode?.leftChild) postOrder(rootNode?.rightChild) print("\(data)\t", terminator: "") } } }</code></pre>

层次遍历

遍历的方式从上到下,从左到右:
<pre><code>`
func levelOrder(rootNode:TreeNode?) -> Void {
var arr:[AnyObject]=[];
arr.append(rootNode!);

while arr.count>0 {
    let firstNode=arr[0] as! TreeNode
    
    if let data=firstNode.data {
        print("\(data)\t", terminator: "")
        arr.removeFirst()
    }
    
    if (firstNode.leftChild != nil) {
        arr.append(firstNode.leftChild!)
    }
    
    if (firstNode.rightChild != nil) {
        arr.append(firstNode.rightChild!)
    }
}

}`</code></pre>

测试

<pre><code>`

let rootList=”ABD##E##CF###”
var rootIndex = -1

func createTree(inout root:TreeNode?) -> Void {

rootIndex=rootIndex+1

if rootIndex>=rootList.characters.count {
    return
}

let data=rootList[rootIndex] as String
if data != "#" {
    root = TreeNode()
    root?.data = data
    
    createTree(&root!.leftChild)
    createTree(&root!.rightChild)
} else {
    root = nil
}

}

var rootNode:TreeNode?
createTree(&rootNode)
print(“先序遍历:”)
preOrder(rootNode)
print(“\n中序遍历:”)
inOrder(rootNode)
print(“\n后序遍历:”)
postOrder(rootNode)
print(“\n层次遍历:”)
levelOrder(rootNode)`</code></pre>
测试结果如图所示:

《Swift-二叉树遍历》 FlyElephant.png

    原文作者:FlyElephant
    原文地址: https://www.jianshu.com/p/2d3d8dddec3f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞