二叉樹

1. 二叉樹分類

滿二叉樹:所有層的節點數均達到了最大值
完全二叉樹:除了最后一層外,所有層的節點數都達到了最大值,最后一層若不滿,則只缺少右邊部分。
平衡二叉樹::它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對值不超過1。

2. 度為二的節點數和葉子節點數的關系

設二叉樹的葉子節點個數為x,二度節點個數為y,1度節點個數為z,總結點個數為N,則有:
x+y+z= N;
又 N個節點一共有 N-1個樹枝,二度節點有2個樹枝,1度節點有1個,葉子沒有,所以:
2y+z = N-1;
可得出 x = y+1.

3.遍歷

只要給出中根遍歷,先根遍歷和后根遍歷的一種,就能確定一棵二叉樹。
只給出先跟順序和后根順序無法確定一棵二叉樹。例如:

  • 樹1:根A和一個左子節點B
  • 樹2:根A和一個右子節點B

1.遞歸遍歷
只給出先根遍歷的遞歸代碼:
Java
//先根遍歷
public void preVisit(Node node){
if(node== null){
return;
}
System.out.println(node.val);
preVisit(node.left);
preVisit(node.right);
}

2.非遞歸遍歷:
```Java```
//非遞歸先根遍歷,
//1 對每個節點,先進行訪問,然后右節點進棧,左節點進棧
//2 彈出棧頂,對棧頂進行1的操作
    public void nonRecursivePre(TreeNode node) {
        if (node == null) {
            return;
        }
        Stack<TreeNode> nodeStack = new Stack<>();
        nodeStack.push(node);
        while (!nodeStack.empty()) {
            TreeNode peek = nodeStack.pop();
            System.out.print(peek.val);
            if (peek.right != null) {
                nodeStack.push(peek.right);
            }
            if (peek.left != null) {
                nodeStack.push(peek.left);
            }
        }
    }
//中根遍歷
    public void nonRecursiveMiddle(TreeNode node) {
        if (node != null) {
            Stack<TreeNode> nodeStack = new Stack<>();
            while (node != null || !nodeStack.empty()) {
                while (node != null) {
                    nodeStack.push(node);
                    node = node.left;
                }
                node = nodeStack.pop();
                System.out.print(node.val);
                node = node.right;
            }
        }
    }
//后根遍歷
    public void nonRecursiveAfter(TreeNode node) {
        if (node != null) {
            Stack<TreeNode> nodeStack = new Stack<>();
            TreeNode pre = null;
            while (node != null || !nodeStack.empty()) {
                while (node != null) {
                    nodeStack.push(node);
                    node = node.left;
                }
                node = nodeStack.peek();
                if (node.right == null || node.right.equals(pre)) {
                    System.out.print(node.val);
                    pre = node;
                    nodeStack.pop();
                    node = null;
                } else {
                    node = node.right;
                }
            }
        }
    }

4. 二叉樹、樹、和森林之間的轉換

二叉樹、樹、和森林之間的轉換

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容