目錄
一、用土方法找到中序前驅
二、中序線索化
三、中序線索二叉樹
四、中序線索化(王道教材版)
五、先序線索化
六、先序線索化(王道教材版)
七、後序線索化
八、後序線索化(王道教材版)
九、總結
//中序遍歷
void inorder(bitree t)
}//訪問結點q
void visit(bitnode * q)
//輔助全域性變數,用於查詢結點p的前驅
bitnode *p; //p指向目標結點
bitnode *pre = null; //指向當前訪問結點的前驅
bitnode *final = null; //用於記錄最終結果
//全域性變數pre,指向當前訪問結點的前驅
threadnode *pre = null;
//中序線索化二叉樹t
void createinthread(threadtree t)
}//線索二叉樹結點
typedef struct threadnodethreadnode,*threadtree;
//中序遍歷二叉樹,一邊遍歷一邊線索化
//中序線索化
void inthread(threadtree p,threadtree &pre)
if(pre != null && pre->rchild == null)
pre = p;
inthread(p->rchild,pre);
}}//中序線索二叉樹t
void createinthread(threadtree t)
}
//全域性變數pre,指向當前訪問結點的前驅
threadnode *pre = null;
//中序線索化二叉樹t
void createinthread(threadtree t)
}//線索二叉樹結點
typedef struct threadnodethreadnode,*threadtree;
//中序遍歷二叉樹,一邊遍歷一邊線索化
void inthread(threadtree t)
}void visit(threadnode *q)
if(pre != null && pre->rchild == null)
pre = q;
}
//中序線索化
void inthread(threadtree p,threadtree &pre)
if(pre != null && pre->rchild == null)
pre = p;
if(p->ltag == 0)
inthread(p->rchild,pre);
inthread(p->lchild,pre); //遞迴、線索化左子樹 }}
//先序線索二叉樹t
void createinthread(threadtree t)
}
//全域性變數pre,指向當前訪問結點的前驅
threadnode *pre = null;
//中序線索化二叉樹t
void createinthread(threadtree t)
}//線索二叉樹結點
typedef struct threadnodethreadnode,*threadtree;
//中序遍歷二叉樹,一邊遍歷一邊線索化
void inthread(threadtree t)
}void visit(threadnode *q)
if(pre != null && pre->rchild == null)
pre = q;
}
//後序線索化
二叉樹線索化
二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...
二叉樹線索化
名稱 二叉樹線索化 說明 這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。這裡要注意的是 對於中序來說,其能線索化後訪問到其前驅和後繼 可以理解為不通過棧訪問到 而對於後序來說,其只能不通過...
二叉樹線索化
public void infixthrnodes treenode node infixthrnodes node.lchild if node.lchild null if pre null pre.rchild null pre node infixthrnodes node.rchild 0...